2010-10-23 3 views
2

Я пытаюсь создать графический интерфейс, используя только собственные окна api. я создаю проекты в VS 2008 с использованием win32 консольного проекта и проекта окна win32, и я использовал образец код от Microsoft, как показано нижесоздать GUI, используя собственный API-интерфейс Window

#include <windows.h> 

// Global variable 

HINSTANCE hinst; 

// Function prototypes. 

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int); 
InitApplication(HINSTANCE); 
InitInstance(HINSTANCE, int); 
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); 

// Application entry point. 

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MSG msg; 

    if (!InitApplication(hinstance)) 
     return FALSE; 

    if (!InitInstance(hinstance, nCmdShow)) 
     return FALSE; 

    BOOL fGotMessage; 
    while ((fGotMessage = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0 && fGotMessage != -1) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return msg.wParam; 
     UNREFERENCED_PARAMETER(lpCmdLine); 
} 

BOOL InitApplication(HINSTANCE hinstance) 
{ 
    WNDCLASSEX wcx; 

    // Fill in the window class structure with parameters 
    // that describe the main window. 

    wcx.cbSize = sizeof(wcx);   // size of structure 
    wcx.style = CS_HREDRAW | 
     CS_VREDRAW;     // redraw if size changes 
    wcx.lpfnWndProc = MainWndProc;  // points to window procedure 
    wcx.cbClsExtra = 0;    // no extra class memory 
    wcx.cbWndExtra = 0;    // no extra window memory 
    wcx.hInstance = hinstance;   // handle to instance 
    wcx.hIcon = LoadIcon(NULL, 
     IDI_APPLICATION);    // predefined app. icon 
    wcx.hCursor = LoadCursor(NULL, 
     IDC_ARROW);     // predefined arrow 
    wcx.hbrBackground = GetStockObject( 
     WHITE_BRUSH);     // white background brush 
    wcx.lpszMenuName = "MainMenu"; // name of menu resource 
    wcx.lpszClassName = "MainWClass"; // name of window class 
    wcx.hIconSm = LoadImage(hinstance, // small class icon 
     MAKEINTRESOURCE(5), 
     IMAGE_ICON, 
     GetSystemMetrics(SM_CXSMICON), 
     GetSystemMetrics(SM_CYSMICON), 
     LR_DEFAULTCOLOR); 

    // Register the window class. 

    return RegisterClassEx(&wcx); 
} 

BOOL InitInstance(HINSTANCE hinstance, int nCmdShow) 
{ 
    HWND hwnd; 

    // Save the application-instance handle. 

    hinst = hinstance; 

    // Create the main window. 

    hwnd = CreateWindow( 
     "MainWClass",  // name of window class 
     "Sample",   // title-bar string 
     WS_OVERLAPPEDWINDOW, // top-level window 
     CW_USEDEFAULT,  // default horizontal position 
     CW_USEDEFAULT,  // default vertical position 
     CW_USEDEFAULT,  // default width 
     CW_USEDEFAULT,  // default height 
     (HWND) NULL,   // no owner window 
     (HMENU) NULL,  // use class menu 
     hinstance,   // handle to application instance 
     (LPVOID) NULL);  // no window-creation data 

    if (!hwnd) 
     return FALSE; 

    // Show the window and send a WM_PAINT message to the window 
    // procedure. 

    ShowWindow(hwnd, nCmdShow); 
    UpdateWindow(hwnd); 
    return TRUE; 

} 

тогда я получил ошибку:

1>c:\users\helloworld\documents\visual studio 2008\projects\motionwindow2\motionwindow2\main.cpp(10) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\helloworld\documents\visual studio 2008\projects\motionwindow2\motionwindow2\main.cpp(11) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\users\helloworld\documents\visual studio 2008\projects\motionwindow2\motionwindow2\main.cpp(56) : error C2440: '=' : cannot convert from 'HGDIOBJ' to 'HBRUSH' 
1>  Conversion from 'void*' to pointer to non-'void' requires an explicit cast 
1>c:\users\helloworld\documents\visual studio 2008\projects\motionwindow2\motionwindow2\main.cpp(57) : error C2440: '=' : cannot convert from 'const char [9]' to 'LPCWSTR' 
1>  Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
1>c:\users\helloworld\documents\visual studio 2008\projects\motionwindow2\motionwindow2\main.cpp(58) : error C2440: '=' : cannot convert from 'const char [11]' to 'LPCWSTR' 
1>  Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
1>c:\users\helloworld\documents\visual studio 2008\projects\motionwindow2\motionwindow2\main.cpp(64) : error C2440: '=' : cannot convert from 'HANDLE' to 'HICON' 
1>  Conversion from 'void*' to pointer to non-'void' requires an explicit cast 
1>c:\users\helloworld\documents\visual studio 2008\projects\motionwindow2\motionwindow2\main.cpp(92) : error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [11]' to 'LPCWSTR' 
1>  Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
1>Build log was saved at "file://c:\Users\HelloWorld\Documents\Visual Studio 2008\Projects\motionwindow2\motionwindow2\Debug\BuildLog.htm" 
1>motionwindow2 - 7 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Кто-нибудь знает, что я поступил неправильно? я вообще не изменял код, и это пустой проект.

Благодаря

+0

документации, поданной. –

ответ

4

У вас есть несколько проблем:.

+0

+1. Хорошие ссылки. Я удалю свой ответ ... –

+0

@Merlyn: У вас был правильный ответ на каждую из трех проблем, даже если это не историческое объяснение. Хорошо, я могу проголосовать за некоторые из ваших других хорошо написанных ответов, чтобы дать вам репутацию, которую вы заслуживаете. –

+0

Если хотите, спасибо. Не обязательно, хотя. Я удалил свой ответ, потому что лучше руководствоваться, чем исправлять, и вы сделали это здесь. –

0

Первая ошибка относится к строке 10.

Таким образом, посмотрите на линии 10:

InitApplication(HINSTANCE); 

В декларации отсутствует тип результата функции.

И так далее.

Приветствия & НТН,

+0

, но это из библиотеки MSDN. Он должен работать, правильно? Http: //msdn.microsoft.com/en-us/library/ms633575 (v = VS.85) .aspx – Grey

+1

@Grey: Возможно, он скомпилирован на одном момент времени, когда спецификатор int по умолчанию (в некоторых местах C/C++ допускает 'int', если вы не указываете тип), это то же самое, что и BOOL. Но времена изменились, и Microsoft не обновила их (crummy) пример кода. BTW, не используйте поведение по умолчанию-int. Мало кто не использует его больше. –

+1

@Merlyn: Образцы для традиционного API Win32 написаны на C. И типы по умолчанию являются одной из областей, где полная фраза «C/C++» бесполезна, поскольку C++ очень сильно отличается от C в этом отношении. –