2009-08-26 4 views
1

VC++를 통해 win32 API에서 생성 된 윈도우에 메뉴를 추가하려고합니다. 이 프로그램은 수정할 수없는 두 가지 오류를 생성합니다.VC++의 Win32 API (메뉴 작성)를 통한 윈도우

코드는 다음과 같습니다.

GENERIC.H

#define IDM_EXIT 100 
#define IDM_TEST 200 
#define IDM_ABOUT 300 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM); 

GENERIC.RC는

#include "windows.h" 
#include "generic.h" 
#include "winver.h" 
MYAPP ICON DISCARDABLE "GENERIC.ICO" 
MYAPP MENU DISCARDABLE 
BEGIN 
POPUP "&File" 
BEGIN 
MENUITEM "E&xit", IDM_EXIT 
END 
MENUITEM "&Test!", IDM_TEST 
POPUP "&Help" 
BEGIN 
MENUITEM "&About MyApp…", IDM_ABOUT 
END 
END 
1 VERSIONINFO 
FILEVERSION 3,3,0,0 
PRODUCTVERSION 3,3,0,0 
FILEFLAGSMASK 0x3fl 
#ifdef _DEBUG 
FILEFLAGS 0xbl 
#else 
FILEFLAGS 0xal 
#endif 
FILEOS 0X4L 
FILETYPE 0x1L 
FILESUBTYPE 0x0L 
BEGIN 
BLOCK "StringFileInfo" 
BEGIN 
BLOCK "040904B0" 
BEGIN 
VALUE "CompanyName", "Your Company\0" 
VALUE "FileDescription", "My Application\0" 
VALUE "FileVersion", "1.0\0" 
VALUE "InternalName", "MyApp\0" 
VALUE "LegalCopyright", "Copyright \251 Your Company. 
1995\0" 
VALUE "LegalTrademarks", "Microsoft\256 is a registered 
trademark of Microsoft 
Corporation. Windows (TM) is 
a trademark of Microsoft 
Corporation\0" 
VALUE "OriginalFilename", "\0" 
VALUE "ProductName", "MyApp\0" 
VALUE "ProductVersion", "1.0\0" 
END 
END 
BLOCK "VarFileInfo" 
BEGIN 
VALUE "Translation", 0x409, 1200 
END 
END 

Generic.C는

#include <windows.h> 
#include "generic.h" 
HINSTANCE hInst; // current instance 
LPCTSTR lpszAppName = "MyApp"; 
LPCTSTR lpszTitle = "My Application"; 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, int nCmdShow) 
{ 
    MSG msg; 
    HWND hWnd; 
    WNDCLASSEX wc; 
    // In Windows 95 or Windows NT the hPrevInstance will always be NULL. 
    //................................................................... 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = (WNDPROC)WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon (hInstance, lpszAppName); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
    wc.lpszMenuName = lpszAppName; 
    wc.lpszClassName = lpszAppName; 
    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.hIconSm = LoadImage(hInstance, lpszAppName, 
     IMAGE_ICON, 16, 16, 
     LR_DEFAULTCOLOR); 
    if (!RegisterClassEx(&wc)) 
     return(FALSE); 
    hInst = hInstance; 
    hWnd = CreateWindow(lpszAppName, 
     lpszTitle, 
     WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, 0, 
     CW_USEDEFAULT, 0, 
     NULL, 
     NULL, 
     hInstance, 
     NULL 
     ); 
    if (!hWnd) 
     return(FALSE); 
    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 
    while(GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return(msg.wParam); 
} 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM 
         lParam) 
{ 
    switch(uMsg) 
    { 
    case WM_COMMAND : 
     switch(LOWORD(wParam)) 
     { 
     case IDM_TEST : 
      break; 
     case IDM_ABOUT : 
      DialogBox(hInst, "AboutBox", hWnd, (DLGPROC)About 
       ); 
      break; 
     case IDM_EXIT : 
      DestroyWindow(hWnd); 
      break; 
     } 
     break; 
    case WM_DESTROY : 
     PostQuitMessage(0); 
     break; 
    default : 
     return(DefWindowProc(hWnd, uMsg, wParam, lParam)); 
    } 
    return(0L); 
} 
LRESULT CALLBACK About(HWND hDlg, 
         UINT message, 
         WPARAM wParam, 
         LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_INITDIALOG: 
     return (TRUE); 
    case WM_COMMAND: 
     if (LOWORD(wParam) == IDOK 
      || LOWORD(wParam) == IDCANCEL) 
     { 
      EndDialog(hDlg, TRUE); 
      return (TRUE); 
     } 
     break; 
    } 
    return (FALSE); 
} 
+0

질문/답변 텍스트 편집기에 버튼이 있습니다. 그것에는 1과 0이 있으며 선택한 텍스트를 코드로 포맷하는 데 사용할 수 있습니다. – jscharf

+1

수정할 수없는 오류는 무엇입니까? – dreamlax

답변

1

나도 몰라하는 Y 오류 ou've있어하지만 난 당신의 코드를 컴파일하려고 할 때 나는 형식 변환 또한

wc.hIconSm = LoadImage(hInstance, lpszAppName, 
    IMAGE_ICON, 16, 16, 
    LR_DEFAULTCOLOR); 

에 대한 단 하나의 오류를했다, 나는 당신이 DialogBox 기능에 잘못된 두 번째 인수를 전달할 것으로 나타났습니다. 대화 상자의 리소스 식별자가 MAKEINTRESOURCE을 통해 LPCTSTR로 변환 될 것으로 예상합니다. 따라서 다음과 같이 추가해야합니다.

IDD_ABOUTBOX DIALOG DISCARDABLE 34, 22, 217, 55 
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "About ..." 
FONT 8, "MS Sans Serif" 
BEGIN 
    LTEXT   "About me",1000,40,10,76,8 
    DEFPUSHBUTTON "OK",IDOK,176,6,32,14,WS_GROUP 
END 

generic.rc 파일에 추가해야합니다.

희망이 도움이됩니다. 당신이 당신의 문제에 대해 더 분명하다면 훨씬 더 좋을지라도. 그리고 약간의 GUI 프로그래밍을하거나 최소한 Visual Studio Wizard에서 간단한 win32 프로젝트를 생성하고 연구하도록하려면 약간 MSDN windows programming section을 공부하는 것이 좋습니다.

1
Generic.c 
----------- 
#define IDM_EXIT   100 
#define IDM_TEST   200 
#define IDM_ABOUT   300 
#define MYAPP1    400 
#define IDD_ABOUTBOX  500 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); 
LRESULT CALLBACK About (HWND, UINT, WPARAM, LPARAM);