// include the basic windows header file
#include <windows.h>
#include <windowsx.h>
// the WindowProc function prototype LRESULT CALLBACK WindowProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam);
// the entry point for any Windows program int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow) {
// the handle for the window, filled by a function
HWND hWnd;
// this struct holds information for the window class
WNDCLASSEX wc;
// clear out the window class for use
ZeroMemory(&wc, sizeof(WNDCLASSEX));
// fill in the struct with the needed information
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = L"WindowClass1";
// register the window class
RegisterClassEx(&wc);
// create the window and use the result as the handle
hWnd = CreateWindowEx(NULL,
L"WindowClass1", // name of the window class
L"Our First Windowed Program", // title of the window
WS_OVERLAPPEDWINDOW, // window style
300, // x-position of the window
300, // y-position of the window
500, // width of the window
400, // height of the window
NULL, // we have no parent window, NULL
NULL, // we aren't using menus, NULL
hInstance, // application handle
NULL); // used with multiple windows, NULL
// display the window on the screen
ShowWindow(hWnd, nCmdShow);
// enter the main loop:
// this struct holds Windows event messages
MSG msg;
// wait for the next message in the queue, store the result in 'msg'
while(GetMessage(&msg, NULL, 0, 0))
{
// translate keystroke messages into the right format
TranslateMessage(&msg);
// send the message to the WindowProc function
DispatchMessage(&msg);
}
// return this part of the WM_QUIT message to Windows
return msg.wParam; }
// this is the main message handler for the program LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
// sort through and find what code to run for the message given
switch(message)
{
// this message is read when the window is closed
case WM_DESTROY:
{
// close the application entirely
PostQuitMessage(0);
return 0;
} break;
}
// Handle any messages the switch statement didn't
return DefWindowProc (hWnd, message, wParam, lParam); }
=============== I use CodeBlock, this code is from a Direct X tutorial.
I get the following errors:
||In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':|
error: cannot convert 'const wchar_t [13]' to 'LPCSTR {aka const char*}' in assignment|
|49|warning: converting to non-pointer type 'DWORD {aka long unsigned int}' from NULL [-Wconversion-null]|
|49|error: cannot convert 'const wchar_t*' to 'LPCSTR {aka const char*}' for argument '2' to 'HWND__* CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)'|
||=== Build finished: 2 errors, 1 warnings ===|
Your project doesn't have the UNICODE
preprocessor symbol defined, so Windows API functions that take pointers to strings expect char *
and not wchar_t *
. Change
L"WindowClass1"
to
"WindowClass1"
Do the same for the remaining string literals. Alternatively, change them to _T("WindowClass1")
, this will expand to the correct type of string literal based on the UNICODE
symbol being defined.
My recommendation is to go to your project properties and change the Character Set
setting to Unicode
, and then use the wide char versions of all Windows API functions explicitly. For example, instead of CreateWindow
, call CreateWindowW
.
EDIT:
The project setting I suggested only applies to Visual Studio, not sure how to do that in Code::Blocks.
1) If you want to compile with UNICODE, then change the options. If you are compiling from IDE, the set the following propery Configuration Properties -> General -> Project Defaults -> Character Set -> Use Unicode Character Set.
If compiling from command line use options /DUNICODE /D_UNICODE
If you don't want to compile with UNICODE, just follow steps 2 & 3 below. In Char Set, do not chose UNICODE.
2) Before
#include <windows.h>
add
#include <tchar.h>
3) Change
wc.lpszClassName = L"WindowClass1";
to
wc.lpszClassName = _T("WindowClass1");
If you want to compile with UNICODE, you could get by just by doing #1, but best to do all 3.
If you want to compile without UNICODE, do #2 & #3 - don't do #1.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With