Problems Creating A Window

Hello,

I am using Windows 7 Professional, Service Pack 1 and Code::Blocks using codeblocks-17.12mingw-setup.

It appears that Code::Blocks 17.12 does not know about wWinMain, so I am using WinMain. However, I cannot create the window using CreateWindowExW. What is wrong with the following programme snippet?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <windows.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
{
    WNDCLASSEXW wc;
    HWND hWnd;

    wc.cbSize = sizeof(WNDCLASSEXW);
    wc.style = CS_HREDRAW|CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_APPLICATION);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
    wc.lpszMenuName = L"Forms Template";
    wc.lpszClassName = L"BasicApp";
    wc.hIconSm  = LoadIcon(0, IDI_APPLICATION);

    if(!RegisterClassExW(&wc))
    {
        MessageBoxExW(0, L"Window Registration Failed!", L"Error!", MB_ICONEXCLAMATION|MB_OK, 0);
        return 0;
    }

hWnd = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, L"Sample Window Class", L"Learn to Program Windows", WS_VISIBLE, 100, 100, 500, 500, 0, 0, hInstance, 0);

    if(!hWnd)
    {
        MessageBoxExW(0, L"Window Creation Failed!", L"Error!", MB_ICONEXCLAMATION|MB_OK, 0);
        return 0;
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND   hWnd, UINT   uMsg, WPARAM wParam, LPARAM lParam)
{

    return 0;
}


Any help would be appreciated.
closed account (E0p9LyTq)
You need to define UNICODE since you want to use the Unicode version of the Win32 structs and functions.

One method could be (decidedly old school)
1
2
#define UNICODE
#define _UNICODE 

before including the Windows header.

Or use Visual Studio 2017. It is free now in the Community edition and defaults to using UNICODE when creating each new project.
Thank you FurryGuy, but, unfortunately, that doesn't work.

I have tried this in Visual Studio 2013 with the same result.
What's the error? Is it a build error or a run time error?
closed account (z05DSL3A)
The registered windows class name doesn't match
1
2
wc.lpszClassName = L"BasicApp";
hWnd = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, L"Sample Window Class", ....
Helios it is a run time error.

Grey Wolf I made the change but still does not run.
closed account (z05DSL3A)
WNDCLASSEXW has probably got other fields set incorrectly, is this code created by you or copied from elsewhere?

Grey Wolf, this is my code, based upon CreateWindowExW Structure by Microsoft.
closed account (z05DSL3A)
See if you can get the following to run...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// GT_HelloWorldWin32.cpp  
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c  

#include <windows.h>  
#include <stdlib.h>  
#include <string.h>  
#include <tchar.h>  

// Global variables  

// The main window class name.  
static TCHAR szWindowClass[] = _T("win32app");

// The string that appears in the application's title bar.  
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

HINSTANCE hInst;

// Forward declarations of functions included in this code module:  
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int CALLBACK WinMain(
    _In_ HINSTANCE hInstance,
    _In_ HINSTANCE hPrevInstance,
    _In_ LPSTR     lpCmdLine,
    _In_ int       nCmdShow
)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL,
            _T("Call to RegisterClassEx failed!"),
            _T("Win32 Guided Tour"),
            NULL);

        return 1;
    }

    hInst = hInstance; // Store instance handle in our global variable  

    // The parameters to CreateWindow explained:  
    // szWindowClass: the name of the application  
    // szTitle: the text that appears in the title bar  
    // WS_OVERLAPPEDWINDOW: the type of window to create  
    // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)  
    // 500, 100: initial size (width, length)  
    // NULL: the parent of this window  
    // NULL: this application does not have a menu bar  
    // hInstance: the first parameter from WinMain  
    // NULL: not used in this application  
    HWND hWnd = CreateWindow(
        szWindowClass,
        szTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        500, 100,
        NULL,
        NULL,
        hInstance,
        NULL
    );

    if (!hWnd)
    {
        MessageBox(NULL,
            _T("Call to CreateWindow failed!"),
            _T("Win32 Guided Tour"),
            NULL);

        return 1;
    }

    // The parameters to ShowWindow explained:  
    // hWnd: the value returned from CreateWindow  
    // nCmdShow: the fourth parameter from WinMain  
    ShowWindow(hWnd,
        nCmdShow);
    UpdateWindow(hWnd);

    // Main message loop:  
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}

//  
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)  
//  
//  PURPOSE:  Processes messages for the main window.  
//  
//  WM_PAINT    - Paint the main window  
//  WM_DESTROY  - post a quit message and return  
//  
//  
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR greeting[] = _T("Hello, World!");

    switch (message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);

        // Here your application is laid out.  
        // For this introduction, we just print out "Hello, World!"  
        // in the top left corner.  
        TextOut(hdc,
            5, 5,
            greeting, _tcslen(greeting));
        // End application-specific layout section.  

        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }

    return 0;
}
from https://msdn.microsoft.com/en-us/library/bb384843.aspx
Your WinMain didn't have a message loop and also no ShoWindow command.
Your WndProc didn't call DefWindowProc
Try this - it works on VS 2017
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <windows.h>

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

const wchar_t szClassName[] = L"BasicApp";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
{
  WNDCLASSEXW wc = {0};
  HWND hWnd = nullptr;
  MSG messages;

  wc.cbSize = sizeof(WNDCLASSEXW);
  wc.style = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc = WindowProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = hInstance;
  wc.hIcon = LoadIcon(0, IDI_APPLICATION);
  wc.hCursor = LoadCursor(0, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
  wc.lpszMenuName = L"Forms Template";
  wc.lpszClassName = szClassName;
  wc.hIconSm = LoadIcon(0, IDI_APPLICATION);

  if (!RegisterClassExW(&wc))
  {
    
    MessageBoxExW(0, L"Window Registration Failed!", L"Error!", MB_ICONEXCLAMATION | MB_OK, 0);
    return 0;
  }

  hWnd = CreateWindowExW(0, szClassName, L"Learn to Program Windows", 
                         WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, 0, 0, 
                         hInstance, 0);

  if (!hWnd)
  {
    MessageBoxExW(0, L"Window Creation Failed!", L"Error!", MB_ICONEXCLAMATION | MB_OK, 0);
    return 0;
  }

  ShowWindow(hWnd, nCmdShow);
  while (GetMessage(&messages, NULL, 0, 0))
  {
    TranslateMessage(&messages);
    DispatchMessage(&messages);
  }

  return static_cast<int>(messages.wParam);
}

LRESULT CALLBACK WindowProc(HWND   hWnd, UINT   uMsg, WPARAM wParam, LPARAM lParam)
{
  switch(uMsg)
  {
    case WM_CREATE:
    {
      HINSTANCE hIns = ((LPCREATESTRUCT)lParam)->hInstance;
      return 0;
    }
    case WM_COMMAND:
    {
      return 0;
    }
    case WM_DESTROY:
    {
      PostQuitMessage(0);
      return 0;
    }
  }
  return (DefWindowProc(hWnd, uMsg, wParam, lParam));

}
Topic archived. No new replies allowed.