WINDOWS程序设计第五版中的一个简单问题,在线等!!!

yiruirui0507 2011-01-07 11:58:34
#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM) ;

int iCurrentColor = IDC_BLACK,
iCurrentFigure = IDC_RECT ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("About2") ;
MSG msg ;
HWND hwnd ;
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateWindow (szAppName, TEXT ("About Box Demo Program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

void PaintWindow (HWND hwnd, int iColor, int iFigure)
{
static COLORREF crColor[8] = { RGB ( 0, 0, 0), RGB ( 0, 0, 255),
RGB ( 0, 255, 0), RGB ( 0, 255, 255),
RGB (255, 0, 0), RGB (255, 0, 255),
RGB (255, 255, 0), RGB (255, 255, 255) } ;

HBRUSH hBrush ;
HDC hdc ;
RECT rect ;

hdc = GetDC (hwnd) ;
GetClientRect (hwnd, &rect) ;
hBrush = CreateSolidBrush (crColor[iColor - IDC_BLACK]) ;
hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;

if (iFigure == IDC_RECT)
Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
else
Ellipse (hdc, rect.left, rect.top, rect.right, rect.bottom) ;

DeleteObject (SelectObject (hdc, hBrush)) ;
ReleaseDC (hwnd, hdc) ;
}

void PaintTheBlock (HWND hCtrl, int iColor, int iFigure)
{
InvalidateRect (hCtrl, NULL, TRUE) ;
UpdateWindow (hCtrl) ;
PaintWindow (hCtrl, iColor, iFigure) ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HINSTANCE hInstance ;
PAINTSTRUCT ps ;

switch (message)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
return 0 ;

case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDM_APP_ABOUT:
if (DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc))
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
}
break ;

case WM_PAINT:
BeginPaint (hwnd, &ps) ;
EndPaint (hwnd, &ps) ;

PaintWindow (hwnd, iCurrentColor, iCurrentFigure) ;
return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
static HWND hCtrlBlock ;
static int iColor, iFigure ;

switch (message)
{
case WM_INITDIALOG:
iColor = iCurrentColor ;
iFigure = iCurrentFigure ;

CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE, iColor) ;
CheckRadioButton (hDlg, IDC_RECT, IDC_ELLIPSE, iFigure) ;

hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ;

SetFocus (GetDlgItem (hDlg, iColor)) ;
return FALSE ;

case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDOK:
iCurrentColor = iColor ;
iCurrentFigure = iFigure ;
EndDialog (hDlg, TRUE) ;
return TRUE ;

case IDCANCEL:
EndDialog (hDlg, FALSE) ;
return TRUE ;

case IDC_BLACK:
case IDC_RED:
case IDC_GREEN:
case IDC_YELLOW:
case IDC_BLUE:
case IDC_MAGENTA:
case IDC_CYAN:
case IDC_WHITE:
iColor = LOWORD (wParam) ;
CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE, LOWORD (wParam)) ;
PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
return TRUE ;

case IDC_RECT:
case IDC_ELLIPSE:
iFigure = LOWORD (wParam) ;
CheckRadioButton (hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD (wParam)) ;
PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
return TRUE ;
}
break ;

case WM_PAINT:
PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
break ;
}
return FALSE ;
}

这个是对话框那章节的第二个例子,其中有一点想不明白。
我把
void PaintTheBlock (HWND hCtrl, int iColor, int iFigure)
{
InvalidateRect (hCtrl, NULL, TRUE) ;
UpdateWindow (hCtrl) ;
PaintWindow (hCtrl, iColor, iFigure) ;
}
中的TRUE变成FALSE程序也没任何变化,疑问产生:当起初运行时整个控件hCtrl中画了一个矩形,整体都是黑色,当选中椭圆的时候,hCtrl中变成了一个椭圆,我们知道椭圆肯定是不能把整个控件的空间像矩形那样给填满的,我的意思是,这里画出来的椭圆其实也应该是矩形才对嘛,因为我把InvalidateRect的第三个参数改成了FALSE,就是不擦除背景,也就是说刚开始被黑色矩形所占据的空间不擦除,现在仍然是黑色才对,所以你画椭圆也就是画的矩形才对。
但是程序中真的能画出椭圆,请问问题出在什么地方?3Q!
...全文
558 56 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2011-01-15
  • 打赏
  • 举报
回复
点击对话框的×号得到:WM_COMMAND->ID=2=IDCANCEL
从WM_SYSCOMMAND 会得到WM_CLOSE
yiruirui0507 2011-01-15
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 schlafenhamster 的回复:]
点击对话框的×号得到:WM_COMMAND->ID=2=IDCANCEL
从WM_SYSCOMMAND 会得到WM_CLOSE
[/Quote]
哦,这样的情况啊。3Q。是时候结帖子了。
yiruirui0507 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 schlafenhamster 的回复:]
这样查ID:
case WM_COMMAND:
sprintf(prompt,"%d",LOWORD (wParam));
MessageBox(hDlg,prompt,"ID",MB_OK);//=2
switch (LOWORD (wParam))
{
case IDOK:
iCurrentColor = iColor ;
iCurrentFigure = iFigure ……
[/Quote]
这里你是什么意思?不太明白。。。。
schlafenhamster 2011-01-14
  • 打赏
  • 举报
回复
这样查ID:
case WM_COMMAND:
sprintf(prompt,"%d",LOWORD (wParam));
MessageBox(hDlg,prompt,"ID",MB_OK);//=2
switch (LOWORD (wParam))
{
case IDOK:
iCurrentColor = iColor ;
iCurrentFigure = iFigure ;
//
DeleteObject(g_hbrush);
//
EndDialog (hDlg, TRUE) ;
return TRUE ;

case IDCANCEL://=2! EndDialog (hDlg, FALSE) ;
return TRUE ;
schlafenhamster 2011-01-14
  • 打赏
  • 举报
回复
帮助文件“Different Ways to Close an Application Under Windows”
Windows posts the WM_SYSCOMMAND message to the application. If the application passes the WM_SYSCOMMAND message to DefWindowProc, the application receives a WM_CLOSE message
yiruirui0507 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 schlafenhamster 的回复:]
掉了2句:
OutputDebugString("dlg color\n");
FillRect(ps.hdc,&ps.rcPaint,hbr);//pink
EndPaint(hWnd,&ps);
return TRUE;
[/Quote]

遇到一个比较好奇的问题,想知道你对此问题的看法,先贴函数吧
BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
EndDialog(hDlg,0);
return TRUE;
default:
MessageBox(hDlg,TEXT("xx"),TEXT("oo"),MB_OK);
}
break;
case WM_CLOSE:
//PostQuitMessage(0);
EndDialog(hDlg,0);
return TRUE;
case WM_SYSCOMMAND:
switch(wParam)
{
case SC_CLOSE:
MessageBox(hDlg,TEXT("Xxx"),TEXT("Ooo"),MB_OK);
default:
return FALSE;
}

}
return FALSE;
}


这是一个模态对话框,当点击模态对话框最上角那个关闭差号时,消息响应的方式。
我做的实验如下:
当只有WM_COMMAND的时候,确实输出了 XX00,证明点差号也确实响应了WM_COMMAND消息
当有WM_COMMAND+WM_CLOSE的时候,直接关闭,调试发现,没进入WM_COMMAND消息
当3者都有的情况下,首先响应的是WM_SYSCOMMAND,输出XXX000,然后WM_CLOSE关闭,没进入WM_COMMAND。

对上述的情况有什么解释?查了消息的优先级也没找到一点有用的。
schlafenhamster 2011-01-13
  • 打赏
  • 举报
回复
我这是取巧,BS_NULL==1;因为不能返回0,否则窗口过程会返回默认画刷。
我看看能不能得到默认画刷。
yiruirui0507 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 schlafenhamster 的回复:]
我估计static控件是这样画的:
case WM_PAINT:
BeginPaint(hWnd,&ps);
// Get a brush with the background color.
hbr = (HBRUSH)SendMessage(GetParent(hWnd),WM_CTLCOLORSTATIC,(WPARAM)ps.hdc,(LPARAM)hWnd); EndP……
[/Quote]

首先上面的那些代码我已经告诉你了,一直用的都是同一个背景,就是WM_CTLCOLORSTATIC里的那个画刷,并且在上面我也问过了,那里的TRUE跟FALSE已经没有什么区别了。并且总结了原因是因为WM_ERASEBKGND消息被触发导致的。

你这里的代码是模仿系统内部实现的吧。看起来挺不错,已经测试了。
yiruirui0507 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 schlafenhamster 的回复:]
1》当“比如窗口被挡住,最小最大化均导致窗口重绘“时系统会INVALIDATERECT被改变的更新区,有了更新区系统就要发wm-paint。
2》2个画刷在dlg中产生和销毁;
case WM_INITDIALOG:
iColor = iCurrentColor ;
iFigure = iCurrentFigure ;
//
g_hbrush=CreateSolidBrush(RGB(……
[/Quote]

哦,明白你的意思了,发觉上面那个问题我问的有点呆瓜。可以在WM_CTLCORLORSTATIC中制定画刷。懂了。
我把1变成0就是返回BS_NULL,这个BS_NULL是空画刷,这个空画刷就是没有刷的意思吧,这里跟默认的一样,难不成BS_NULL==CreateSolidBrush(RGB(GetRValue(GetSysColor(COLOR_BTNFACE)),GetGValue(GetSysColor(COLOR_BTNFACE)),GetBValue(GetSysColor(COLOR_BTNFACE))));,这个是系统标准对话框,控件的默认背景色就是灰不溜秋的那个颜色。
BS_NULL跟这个效果一摸一样。何解?
schlafenhamster 2011-01-13
  • 打赏
  • 举报
回复
掉了2句:
OutputDebugString("dlg color\n");
FillRect(ps.hdc,&ps.rcPaint,hbr);//pink
EndPaint(hWnd,&ps);
return TRUE;
schlafenhamster 2011-01-13
  • 打赏
  • 举报
回复
我估计static控件是这样画的:
case WM_PAINT:
BeginPaint(hWnd,&ps);
// Get a brush with the background color.
hbr = (HBRUSH)SendMessage(GetParent(hWnd),WM_CTLCOLORSTATIC,(WPARAM)ps.hdc,(LPARAM)hWnd); EndPaint(hWnd,&ps);
return TRUE;
这样:
InvalidateRect (hCtrl, NULL, FALSE);//TRUE) ;//都一样了
schlafenhamster 2011-01-13
  • 打赏
  • 举报
回复
1》当“比如窗口被挡住,最小最大化均导致窗口重绘“时系统会INVALIDATERECT被改变的更新区,有了更新区系统就要发wm-paint。
2》2个画刷在dlg中产生和销毁;
case WM_INITDIALOG:
iColor = iCurrentColor ;
iFigure = iCurrentFigure ;
//
g_hbrush=CreateSolidBrush(RGB(255,255,0));//yellow
hbrush1=CreateSolidBrush(RGB(255,0,255)); //pink
3》不是有个#if 0吗?这是给你做实验的,改成1试试
case WM_CTLCOLORSTATIC:
{
//hdcStatic = (HDC) wParam; // handle to display context
HWND hwndStatic = (HWND) lParam; //
if(hwndStatic==hCtrlBlock)
{
//OutputDebugString("WM_CTLCOLORSTATIC\n");
#if 1
return (BOOL) hbrush1;
#else
return (BOOL) BS_NULL;//do not return 0, otherwise default will be called
#endif
}
return FALSE ;
}
schlafenhamster 2011-01-12
  • 打赏
  • 举报
回复
问题2 为什么HDlg的WM_CTLCOLORSTATIC :

LRESULT CALLBACK StaticProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hparentwnd;
PAINTSTRUCT ps;
HDC hdc;
HBRUSH brsh;
switch(message)
{
case WM_PAINT: //如果处理了此消息,WM_CTLCOLORSTATIC也无效了
// OutputDebugString("StaticProc3\n");
// return CallWindowProc(OldStatic, hwnd, message, wParam, lParam );
hparentwnd=GetParent(hwnd);
//OutputDebugString("Before BeginPaint\n");
hdc = BeginPaint(hwnd, &ps);
//OutputDebugString("After BeginPaint\n");
//!!!
brsh=(HBRUSH) SendMessage(hparentwnd,WM_CTLCOLORSTATIC,(WPARAM)hdc,(LPARAM)hwnd);
::FillRect(hdc,&ps.rcPaint,brsh);
//!!!
TextOut(hdc, 10, 10, "Color Red", 9);
EndPaint(hwnd, &ps);
return 0;
case WM_ERASEBKGND:
//OutputDebugString("Inside BeginPaint\n");
//hdc = (HDC) wParam;
return 1;//handled
}
return CallWindowProc( OldStatic, hwnd, message, wParam, lParam );
}

brsh=(HBRUSH) SendMessage(hparentwnd,WM_CTLCOLORSTATIC,(WPARAM)hdc,(LPARAM)hwnd);
只有这样父窗口(dlg)的WM_CTLCOLORSTATIC 才起作用!
yiruirui0507 2011-01-12
  • 打赏
  • 举报
回复
对于下面这段代码测试中没发现什么疑点,但是测试完毕我把PaintTheBlock中的第三个参数由TRUE变成了FALSE,也就是我以后打算不触发WM_ERASEBKGND消息了,不再想刷背景了,但是测试发现它仍然是以绿色为背景画刷的,这里有点纳闷,我是这么想的,首先WM_ERASEBKGND消息跟WM_PAINT消息类似并不是只有你INVALIDATERECT才能触发(能触发的情况多了,比如挡住,最大最小化等情况),这里其实对WM_ERASEBKGND的消息我真的不确定挡住,最大最小化是否会触发,这个消息没咋么了解。

但是我调试发现OUTPUTDEBUGSTRING只输出一次WM_CTLCOLORSTATIC 也就是说WM_ERASEBKGND一共被触发了1次。至于这次是何时?什么情况下触发的就不确定了(你给说说吧)

仅仅触发了一次就从对话框中返回了hbr=绿色画刷,这点我承认。问题是这样的:返回的画刷是绿色,OK。但是我以后画其他颜色的其他图形并没有打算在刷背景了(INVALIDATERECT(1,2,FALSE))所以按照我的分析以后背景是上次的底色才对嘛,但是事实上却还是绿色

难道又是系统帮我们处理的吗?默认用HBR=绿色处理?但是我们已经要求不需要处理了啊,这个算矛盾???关于这点不明白,望看看哪里又出洞子了,3Q!
yiruirui0507 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 schlafenhamster 的回复:]
我改了改:
case WM_ERASEBKGND:
hdc = (HDC) wParam;
GetClientRect(hWnd,&rc);
// Get a brush with the background color.
hbr = (HBRUSH)SendMessage(GetParent(hWnd),WM_CTLCOLORSTATIC,(WPARAM)hdc,(LPARA……
[/Quote]

上面你说的只有INVALIDATERECT窗口才重绘,只有BeginPaint窗口才停止重绘!这个是事实,也不是全部,比如窗口被挡住,最小最大化均导致窗口重绘并没有INVALIDATERECT。关于BEGINPAINT也仔细看了,他就是让当前的需要重绘的区域变成空,否则就一直发送WM_PAINT死循环了,另一个作用就是跟WM_ERASEBKGND有关,当然还需要INVALIDATERECT的最后一个参数来决定是否触发此消息。

下面的代码测试了,发现一点问题,不知道这里的WM_CTLCOLORSTATIC有什么作用,这个完全没必要,因为这个消息是在对话框中处理的,我是这样测试的:
在对话框的WM_CTLCOLORSTATIC中有这句 hbrush=CreateSolidBrush(RGB(0,255,0)); 绿色画刷子。
所以你下面的代码中
	case WM_ERASEBKGND:
g_hbrush=CreateSolidBrush(RGB(255,255,0));
hdc = (HDC) wParam;
GetClientRect(hWnd,&rc);
// Get a brush with the background color.
hbr = (HBRUSH)SendMessage(GetParent(hWnd),WM_CTLCOLORSTATIC,(WPARAM)hdc,(LPARAM)hWnd);
// If we got a brush, select it into our DC.
if(hbr == (HBRUSH)BS_NULL)
{
OutputDebugString(L"WM_ERASEBKGND\n");
FillRect(hdc,&rc,g_hbrush);//yellow
}
else
{
OutputDebugString(L"WM_CTLCOLORSTATIC\n");
FillRect(hdc,&rc,hbr);//pink
}
// Return a non-zero, indicating we processed a message.
return 1;

这里 hbr = (HBRUSH)SendMessage(GetParent(hWnd),WM_CTLCOLORSTATIC,(WPARAM)hdc,(LPARAM)hWnd);返回的画刷就是对话框中的绿色画刷,即hbr=绿色画刷不等于BS_NULL(空画刷)因此跳到ELSE去执行,用绿色做背景,结果也是这样。至于下面那个WM_CTLCOLORSTATIC不晓得有什么用。
yiruirui0507 2011-01-12
  • 打赏
  • 举报
回复
刚开始显示蓝色矩形找到原因了,因为在HDlg的窗口函数的WM_PAINT消息中没有画图函数PaintTheBlock函数,并没有画任何图像,所以当次控件显示的时候去触发它本身的WM_PAINT消息,而它本身WM_PAINT中仅仅只是把客户区变成了有效仍然没有画图,所以本应该什么都没。
但是控件本身显示的时候会触发WM_ERSABKGND(关于这个我没找到准确的资料,但是调试中发现确实进入了这个消息中,并且相当确切的知道,肯定是先WM_PAINT消息然后WM_ERSABKGND消息),既然后进入WM_ERSABKGND消息,所以背景为蓝色了。

后面能正常显示应该跟InvalidateRect这个函数有关系吧,它第三个参数为TRUE,会先触发WM_ERABKGND消息,后触发WM_PAINT消息?还是顺序相反呢?这两个消息不知道具体什么时候谁先谁后,比较接近现实的就是先擦除后变有效才能然后画图嘛。找了半天没发现什么特别的,贴一段话吧,不是很理解
http://www.360doc.com/content/10/1121/11/3550092_71118727.shtml 这里说的我不理解所以就给个链接吧,真的没心思打这些不理解的字,见谅。

yiruirui0507 2011-01-12
  • 打赏
  • 举报
回复
先画后擦也是不对的,因为后面的就正常了,关键代码在下面
void PaintTheBlock (HWND hCtrl, int iColor, int iFigure)
{
InvalidateRect (hCtrl, NULL, TRUE) ;
UpdateWindow (hCtrl) ;
PaintWindow (hCtrl, iColor, iFigure) ;
}

首先触发控件本身的WM_PAINT消息,然后是WM_ERSABKGND消息,此时此刻背景是个蓝色矩形(刷子是蓝色)
然后执行PaintWindow,实现画黑色矩形,当然画黑色矩形必然导致WM_PAINT WM_ERSABKGND两个姊妹消息,先触发WM_PAINT消息把控件窗口变成有效然后画黑色矩形,画之前不需要WM_ERSABKGND消息了吧,因为没函数触发它。理解的到位么?
yiruirui0507 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 schlafenhamster 的回复:]
"做做如下实验",做了没有?发现什么没有?
[/Quote]

发现问题:1.刚开始运行会出现一个蓝色矩形并没有出现黑色。
LRESULT CALLBACK StaticWndProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
RECT rc;
HBRUSH hbrush;
switch(Msg)
{
case WM_ERASEBKGND:
hdc = (HDC) wParam;
hbrush=CreateSolidBrush(RGB(0,255,0));
GetClientRect(hWnd,&rc);
FillRect(hdc,&rc,hbrush);
OutputDebugString(L"WM_ERASEBKGND\n");
return 1;
case WM_PAINT:
BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
return TRUE;
}
return CallWindowProc(OldWndProc,hWnd,Msg,wParam,lParam);
}


我在那里加了一个蓝色的画刷。也就是说是先完成的画图后擦除的背景?是先实现的WM_PAINT消息后实现WM_ERASEBKGND?先画后擦?
问题2 为什么HDlg的WM_CTLCOLORSTATIC 这里的画刷并没有起到任何作用?MSDN上说当控件重绘时会触发父窗口的这个消息,并在这里返回擦除背景的画刷,但是这里却没发挥一点作用。
schlafenhamster 2011-01-12
  • 打赏
  • 举报
回复
我改了改:
case WM_ERASEBKGND:
hdc = (HDC) wParam;
GetClientRect(hWnd,&rc);
// Get a brush with the background color.
hbr = (HBRUSH)SendMessage(GetParent(hWnd),WM_CTLCOLORSTATIC,(WPARAM)hdc,(LPARAM)hWnd);
// If we got a brush, select it into our DC.
if(hbr == (HBRUSH)BS_NULL)
{
OutputDebugString("WM_ERASEBKGND\n");
FillRect(hdc,&rc,g_hbrush);//yellow
}
else
{
OutputDebugString("WM_CTLCOLORSTATIC\n");
FillRect(hdc,&rc,hbr);//pink
}
// Return a non-zero, indicating we processed a message.
return 1;
//
case WM_CTLCOLORSTATIC:
{
//hdcStatic = (HDC) wParam; // handle to display context
HWND hwndStatic = (HWND) lParam; //
if(hwndStatic==hCtrlBlock)
{
//OutputDebugString("WM_CTLCOLORSTATIC\n");
#if 1
return (BOOL) hbrush1;
#else
return (BOOL) BS_NULL;//do not return 0, otherwise default will be called
#endif
}
return FALSE ;
}
//你再试试
schlafenhamster 2011-01-12
  • 打赏
  • 举报
回复
"做做如下实验",做了没有?发现什么没有?
加载更多回复(34)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧