Reputation: 35
Stackflow Members ---- i'm beginner in c++ WINAPI --- when i coding in my first WIN32 GUI, appeared some errors [OUTPUT] --- Are there any recommended books to be advanced in C++ --- my codes:
#include <windows.h>
const char g_szClassName[] = ("myWindowClass");
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = (g_szClassName);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc)) {
MessageBox(NULL,
L"Window Registration Failed!",
L"Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// Creating the Window
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
(g_szClassName),
L"The title of my window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL);
if(hwnd == NULL) {
MessageBox(NULL,
L"Window Creation Failed!",
L"Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
// Step 3: The Message Loop
while(GetMessage(&Msg, NULL, 0, 0) > 0) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
output :
3 IntelliSense: argument of type "const char *" is incompatible with parameter of type "LPCWSTR" c:\Users\Youssef\Documents\Visual Studio 2012\Projects\Win32Project2\Win32Project2\Win32Project2.cpp 46 2 Win32Project2
2 IntelliSense: a value of type "const char *" cannot be assigned to an entity of type "LPCWSTR" c:\Users\Youssef\Documents\Visual Studio 2012\Projects\Win32Project2\Win32Project2\Win32Project2.cpp 34 19 Win32Project2
Error 1 error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source? c:\users\youssef\documents\visual studio 2012\projects\win32project2\win32project2\win32project2.cpp 65 1 Win32Project2
Upvotes: 1
Views: 10253
Reputation: 35454
The compilation issue you're having has to do with string types and Windows programs.
Note that there are two character set "build types" for a Windows program. The first is MBCS
and the second is Unicode
. By default (assuming you're using Visual Studio), the build type is Unicode
, meaning that the various Windows API functions will process wide strings, not char
or char
-based strings.
The easiest solution to your problem is to use TCHAR
for character arrays and _T()
macro for string literals meant to be sent and received from Windows API functions. This will ensure your app will compile for Unicode, as well as MBCS (although MBCS programs are now considered obsolete in this day and age).
This line:
wc.lpszClassName = (g_szClassName);
gives an issue, since you are compiling a Unicode application, and this member of WNDCLASSEX
takes an LPCTSTR
(a pointer to TCHAR
), not a const char *
.
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633577%28v=vs.85%29.aspx
So for this problem,
const char g_szClassName[] = ("myWindowClass");
The change should be:
#include <tchar.h> // in case it isn't included
//...
TCHAR g_szClassName[] = _T("myWindowClass");
Upvotes: 2