我最近学SDK编程,但碰到问题。
我把定义、注册、CreateWindow、显示消息循环的过程改为
CreateDialog(hInstance,MAKEINTRESOURCE(IDD,_DIALOG1),NULL,NULL);显示\消息循环
问题1 :产生了不能关闭的问题(右上角的按钮图标)。
问题2 :调用DialogBox产生的子窗口所有的控件对象都不能用。
问题3 :窗口类是不是必需的?即使基于对话框的应用程序

解决方案 »

  1.   

    给你个例子,什么功能都没有,仅仅只能显示和关闭:
    HWND hDlgWnd;
    BOOL CALLBACK DialogFunc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hThisInstance,HINSTANCE hPrevInstance,char *lpCmdLine,int nShowCmd)
    {
    MSG msg; hDlgWnd=CreateDialog(hThisInstance,"Dialog1",NULL,(DLGPROC)DialogFunc);
    while (GetMessage(&msg,NULL,0,0)) {
    if (!IsDialogMessage(hDlgWnd,&msg)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }
    return msg.wParam;
    }BOOL CALLBACK DialogFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
    switch (message) {
    case WM_INITDIALOG:
    return TRUE;
    case WM_COMMAND:
    switch (LOWORD(wParam)) {
    case IDCANCEL:
    DestroyWindow(hwnd);
    PostQuitMessage(0);
    return TRUE;
    }
    break;
    }
    return FALSE;
    }
      

  2.   

    int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
    {
    HWND hWnd;
    MSG msg;
    hInst = hInstance;
    hWnd = CreateDialog(hInst,IDD_DIALOG1,NULL,(DLGPROC)testProc);
    if( !hWnd ) return FALSE;
    ShowWindow(hWnd,nCmdShow);
    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return msg.wParam;
    }
    LRESULT CALLBACK testProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
    {
    HWND hwndn;
    HDC hdc;
    PAINTSTRUCT ps;
    HINSTANCE hW;
    int a;
    switch( message ) {
    case WM_KEYDOWN://击键消息
    switch( wParam ) {
    case VK_ESCAPE:
    MessageBox(hWnd,"ESC键按下了!","Keyboard",MB_OK);
    break; 
    }
    break;
    case WM_RBUTTONDOWN://鼠标消息
    {
    MessageBox(hWnd,"鼠标右键按下了!","Mouse",MB_OK);
    break;
    } case WM_PAINT://窗口重画消息
    {
    char hello[]="你好,我是EasyWin !";
    HDC hdc;
    PAINTSTRUCT ps;
    hdc=BeginPaint( hWnd,&ps ); //取得设备环境句柄
    SetTextColor(hdc, RGB(0,0,255)); //设置文字颜色
    TextOut( hdc, 20, 10, hello, strlen(hello) );//输出文字
    EndPaint( hWnd, &ps ); //释放资源
    break;
    }
    break;
    case WM_DESTROY://退出消息
    PostQuitMessage( 0 );//调用退出函数
    break;
    case WM_CLOSE:
    PostQuitMessage( 0 );//调用退出函数
    break;
    case WM_COMMAND:
    switch(LOWORD (wParam)) {
    case IDOK:
    DialogBox(hInst,"IDD_DIALOG3",hWnd,DlgProc);
    break;
    case IDCANCEL:
    PostQuitMessage( 0 );//调用退出函数
    break;
    case bbb:
    hwndn = CreateDialog(hInst,IDD_DIALOG1,0,(DLGPROC)DlgProc);
    ShowWindow( hwndn, 1);
    break;
    }
    }
    //调用缺省消息处理过程,
    return DefWindowProc(hWnd, message, wParam, lParam);}
      

  3.   

    #include <windows.h>
    #include "resource.h"static TCHAR szAppName[] = TEXT("TEST");
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdline,int iCmdShow)
    {
    HWND hwnd;
    MSG          msg ;
    WNDCLASS     wndclass ;
    int message;

    wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc   = WinProc ;
    wndclass.cbClsExtra    = 0 ;
    wndclass.cbWndExtra    = DLGWINDOWEXTRA ;
    wndclass.hInstance     = hInstance ;
    wndclass.hIcon         = LoadIcon (hInstance,LPSTR(ID_NOTIFYICON)) ;
    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE+1) ;
    wndclass.lpszMenuName  = NULL ;
    wndclass.lpszClassName = szAppName ;

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

    hwnd=CreateDialog(hInstance,szAppName,NULL,NULL) ;     ShowWindow (hwnd, iCmdShow);//显示窗口
    UpdateWindow (hwnd);//刷新窗口

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