2012-04-14 5 views
1

私は非常に奇妙な問題に直面しています。いずれか、以下のコード - と間違っているものを私に伝えることができます:Win32コードの異常

#include <Windows.h> 

LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM); 

char szWinName[]="MyWin"; 

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, 
        LPSTR lpszArgs, int nWinMode) 
{ 
    HWND hwnd; 
    MSG msg; 
    WNDCLASSEX wndclass; 

    wndclass.cbSize=sizeof(WNDCLASSEX); 

    wndclass.hInstance=hThisInst; 
    wndclass.lpszClassName=szWinName; 
    wndclass.lpfnWndProc=WindowFunc; 
    wndclass.style=0; 

    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION) 
    wndclass.hIconSm=NULL; 
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); 

    wndclass.lpszMenuName=NULL; 
    wndclass.cbClsExtra=0; 
    wndclass.cbWndExtra=0; 

    wndclass.hbrBackground=(HBRUSH) GetStockObject(LTGRAY_BRUSH); 

    if(!RegisterClassEx(&wndclass)) return 0; 

    hwnd=CreateWindow(
     szWinName, 
     "Hello World", 
     WS_OVERLAPPED, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     500, 
     500, 
     NULL, 
     NULL, 
     hThisInst, 
     NULL 
     ); 

    ShowWindow(hwnd, nWinMode); 
    UpdateWindow(hwnd); 

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

} 

LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wparam, 
          LPARAM lparam) 
{ 
    switch(message){ 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
     default: 
      return DefWindowProc(hwnd,message,wparam,lparam); 
    } 
    return 0; 
} 

を私は、次の[ウィンドウを取得しています: Output of the above code

あなたは何のシステムメニューはありません見ることができるように。なぜこれが起こっているのか分かりません。しかし、私はそれだけで微を動作するようです次のコードで上記のコード交換する場合:

#include<windows.h> 

LRESULT CALLBACK WinProc(HWND,UINT,WPARAM,LPARAM); 

char szWinName[]="Main Window"; 

int WINAPI WinMain(HINSTANCE thisInst,HINSTANCE prevInst, 
          LPSTR lpCmdArgs, int nMode){ 

    HWND hwnd; 
    MSG msg; 
    WNDCLASSEX wndclass; 

    wndclass.cbSize=sizeof(WNDCLASSEX); 

    wndclass.hInstance=thisInst; 
    wndclass.lpszClassName=szWinName; 
    wndclass.lpfnWndProc=WinProc; 
    wndclass.style=0; 

    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION) 
    wndclass.hIconSm=NULL; 
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); 

    wndclass.lpszMenuName=NULL; 
    wndclass.cbClsExtra=0; 
    wndclass.cbWndExtra=0; 

    wndclass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH); 

    if(!RegisterClassEx(&wndclass)) return 0; 

    hwnd=CreateWindow(szWinName, 
        "Hello World", 
        WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT, 
        CW_USEDEFAULT, 
        500, 
        500, 
        NULL, 
        NULL, 
        thisInst, 
        NULL 
); 

    ShowWindow(hwnd,nMode); 
    UpdateWindow(hwnd); 

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

} 

    LRESULT CALLBACK WinProc(HWND hWnd, UINT message, 
           WPARAM wparam, LPARAM lparam){ 

    switch(message){ 
       case WM_DESTROY: 
        PostQuitMessage(0); 
        break; 
       default: 
       return DefWindowProc(hWnd, message, wparam, lparam); 
       } 
    return 0; 
}      

を誰かが私はすべてのものを試してみましたが、見つけることができませんでした第1のコードセグメントで間違っているものを私に伝えることができてください。何が間違っている。 Visual Studio 2008 Professional Editionで通常のWin32プロジェクトを使用しています。もし誰かが望むなら、私は彼らにそれをテストするためにプロジェクトを郵送することができます。迅速な返答がありがとうございます。ありがとうございました。

答えて

4

下位のコードセグメントでは、WS_OVERLAPPEDWINDOWをウィンドウスタイルとして使用します。これがシステムメニューを提供します。最初のコードセグメントにはWS_OVERLAPPEDしかありません。WS_OVERLAPPEDはタイトルバーと境界線を与えます。

+0

ありがとうございました。私はあなたに借りができた。 – Sreyan

+0

@Sreyan、私はあなたができることはアンサー['this way'](http://meta.stackexchange.com/a/5235/179541)を受け入れることだと思っています;-) – TLama

+0

その情報をありがとう:-) – Sreyan

関連する問題