比如说:
DialoBox(Hinstance, ... , ..., MyPlg)然后是在这个窗口处理函数BOOL CALLBACK MyPlg(.....)
{
case WM_INITDIALOG:
printf("AAA\n");
break;
case WM_SIZE:
printf(“BBB\n");
break; case WM_PAINT:
printf("CCC\n");
break;
case ...
}程序没有问题,编译通过。也正常运行。
但是 没有看到控制台 输出 BBB , 这说明程序压根就没有产生WM_SIZE消息。
而且 其他的case 中有个语句是UpdateWindow(...), 执行过后也没有产生 WM_PAINT。
那么这个时候我要使用SetWindowRgn(),这个函数要放在那个case下面处理啊?
放在WM_PAINT下,产生的窗口不是出了标题拦和窗口边框之外的矩形,形状时很小矩形。
放在WM_INITDIALOG下,窗口都不能显示了。
放在WM_CREATE下,压根就没有执行到,DialoBox创建的窗口没有产生WM_CREATE这个消息。
DialoBox(Hinstance, ... , ..., MyPlg)然后是在这个窗口处理函数BOOL CALLBACK MyPlg(.....)
{
case WM_INITDIALOG:
printf("AAA\n");
break;
case WM_SIZE:
printf(“BBB\n");
break; case WM_PAINT:
printf("CCC\n");
break;
case ...
}程序没有问题,编译通过。也正常运行。
但是 没有看到控制台 输出 BBB , 这说明程序压根就没有产生WM_SIZE消息。
而且 其他的case 中有个语句是UpdateWindow(...), 执行过后也没有产生 WM_PAINT。
那么这个时候我要使用SetWindowRgn(),这个函数要放在那个case下面处理啊?
放在WM_PAINT下,产生的窗口不是出了标题拦和窗口边框之外的矩形,形状时很小矩形。
放在WM_INITDIALOG下,窗口都不能显示了。
放在WM_CREATE下,压根就没有执行到,DialoBox创建的窗口没有产生WM_CREATE这个消息。
#include "resource.h"INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);int _tmain(int argc, _TCHAR* argv[])
{
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
return 0;
}INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HRGN hRgn;
switch(uMsg)
{
case WM_INITDIALOG:
printf("AAA\n");
hRgn = CreateRoundRectRgn(100, 100, 600, 600, 20, 20);
SetWindowRgn(hwndDlg, hRgn, TRUE);
break; case WM_PAINT:
printf("CCC\n");
break; case WM_CLOSE:
DestroyWindow(hwndDlg);
break; case WM_DESTROY:
PostQuitMessage(0);
break; default:
break;
}
return FALSE;
}
INT_PTR CALLBACK MainProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HRGN hRgn;
switch(uMsg)
{
case WM_CREATE:
InsertMenu(..., ..., IDD_MENU1, ...);
break;
case IDD_MENU1:
DialogBox(..., ..., ..., DialogProc);
case WM_PAINT: break;
}
return FALSE;
}INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HRGN hRgn;
switch(uMsg)
{
case WM_INITDIALOG:
printf("AAA\n");
hRgn = CreateRoundRectRgn(100, 100, 600, 600, 20, 20);
SetWindowRgn(hwndDlg, hRgn, TRUE);//放在这里连这个窗口都不能显示了。
break; case WM_PAINT:
printf("CCC\n");
break; default:
break;
}
return FALSE;
}感谢你的回答。
不过针对你的回答,我要提出几点建议。DialogBox创建的窗口最好别用DestroyWindow(hwndDlg);
要用EndDialog(hwndDlg);
还有就是你的程序中不过处理了哪一条语句,都是return FALSE。这个显然是错的。
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HRGN hRgn;
switch(uMsg)
{
case WM_INITDIALOG:
printf("AAA\n");
hRgn = CreateRoundRectRgn(100, 100, 600, 600, 20, 20);
SetWindowRgn(hwndDlg, hRgn, TRUE);
return TRUE; case WM_PAINT:
printf("CCC\n");
return TRUE;
case WM_CLOSE:
DestroyWindow(hwndDlg);
return TRUE; case WM_DESTROY:
PostQuitMessage(0);
return TRUE; default:
break;
}
return FALSE;
}, 处理过你的语句就要返回 TRUE追问:WM_WINDOWPOSCHANGED 这个消息是干嘛的,或者在什么,什么情况下产生这个消息。从名字上来看好像是 当窗口的位置发生改变就会产生。
case WM_INITDIALOG:
{
RECT rc;
GetWindowRect(hDlg, &rc);
hRgn = CreateRoundRectRgn(0, 0, rc.right - rc.left, rc.bottom - rc.top, 20, 20);
SetWindowRgn(hDlg, hRgn, TRUE);//
}
return (INT_PTR)TRUE;
这样是没有问题的