大神们,能给我解答一个疑问么?谢谢。
在DialogProc中处理WM_PAINT时的代码为:
case WM_PAINT:
//对话框在eidt之前处理
hdc=BeginPaint(hWnd,&Ps);
Bitmap=LoadBitmap(hInst,(LPCTSTR)IDB_BITMAP);
hMemDC=CreateCompatibleDC(NULL);
SelectObject(hMemDC,Bitmap);
BitBlt(Ps.hdc,DlgX,DlgY,360,140,hMemDC,0,0,SRCCOPY);
hdc=BeginPaint(GetDlgItem(hWnd,IDC_PASSWORD),&Ps);
SetTextColor(hdc, RGB(255,0,0)) ;
SetBkColor(hdc,RGB(255,255,255));
SetBkMode(hdc, TRANSPARENT);
EndPaint(hWnd,&Ps);
break;
出来的效果是
这里的Edit的背景是对话框的背景。至对话框出现时,WM_CTLCOLOREDIT会在所有WM_PAINT消息前出现1次。
但如果我把处理WM_PAINT的代码稍微调一下顺序,成这样:
Case WM_PAINT:
//对话框在edit之后处理
hdc=BeginPaint(GetDlgItem(hWnd,IDC_PASSWORD),&Ps);
etTextColor(hdc, RGB(255,0,0)) ;
SeStBkColor(hdc,RGB(255,255,255));
SetBkMode(hdc, TRANSPARENT);
hdc=BeginPaint(hWnd,&Ps);
Bitmap=LoadBitmap(hInst,(LPCTSTR)IDB_BITMAP);
hMemDC=CreateCompatibleDC(NULL);
SelectObject(hMemDC,Bitmap);
BitBlt(Ps.hdc,DlgX,DlgY,360,140,hMemDC,0,0,SRCCOPY);
EndPaint(hWnd,&Ps);
break;
Edit的背景仍然是对话框,但是已经看不到edit的边框了。至对话框出现时,WM_CTLCOLOREDIT会在所有WM_PAINT消息前出现1次。
如果再改一下,变为:
case WM_PAINT:
//只处理对话框
hdc=BeginPaint(hWnd,&Ps);
Bitmap=LoadBitmap(hInst,(LPCTSTR)IDB_BITMAP);
hMemDC=CreateCompatibleDC(NULL);
SelectObject(hMemDC,Bitmap);
BitBlt(Ps.hdc,DlgX,DlgY,360,140,hMemDC,0,0,SRCCOPY);
EndPaint(hWnd,&Ps);
break;
这个时候的edit的背景已经不是对话框的了。至对话框出现时,WM_CTLCOLOREDIT会在所有WM_PAINT消息前出现1次,在所有WM_PAINT后出现2次。
这里面有什么玄机么?
再谢!