比如说:
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这个消息。

解决方案 »

  1.   

    #include <Windows.h>
    #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;
    }
      

  2.   

    至于WM_SIZE消息,你拖动边框改变大小的话应该能响应到的。或者使用WM_WINDOWPOSCHANGED消息,这个应该没有问题的,加入对话框的窗口回调函数中即可。
      

  3.   

    我已经放弃用 SetWindowRgn(),我的 SetWindowRgn()放在WM_INITDIALOG压根窗口就不能显示。我也不知道为什么。不过我的情况和你不一样。我的dialogBox是在主窗口的窗口进程 响应 IDD_MENU1才触发的。
    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 这个消息是干嘛的,或者在什么,什么情况下产生这个消息。从名字上来看好像是 当窗口的位置发生改变就会产生。
      

  4.   

    VS2008新建一个Win32 Application,在About对话框的窗口回调函数WM_INITDIALOG中加入
    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;
    这样是没有问题的