下面是关于C语言创建Windows窗口实例的完整攻略,分为以下几个步骤:
1. 引入必要的头文件
首先我们需要在程序中引入必要的头文件,包括Windows.h和tchar.h。这些头文件在使用Windows API时必须被包含,以便于调用其中定义的函数和宏。
#include <windows.h>
#include <tchar.h>
2. 定义窗口过程函数
窗口过程函数是Windows程序中最重要的函数之一。它负责处理窗口的消息和事件,比如响应用户的鼠标和键盘操作,处理窗口的绘制,以及定时器等各种功能。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
3. 注册窗口类
在创建窗口实例之前,我们需要先注册一个窗口类。窗口类是Windows程序中用来描述窗口的一个数据结构,它包含了窗口的各种属性(如背景颜色、边框风格、菜单等)以及窗口过程函数的指针。
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(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = nullptr;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
if (!RegisterClassEx(&wcex))
{
MessageBox(nullptr,
_T("Call to RegisterClassEx failed!"),
_T("Win32 Desktop App"),
MB_ICONERROR);
return 1;
}
这里我们定义了一个WNDCLASSEX结构体,设置了窗口类的各种属性,然后通过RegisterClassEx函数将窗口类注册到Windows系统中。
4. 创建窗口实例
窗口类注册成功后,我们就可以开始创建窗口实例了。创建窗口实例需要使用CreateWindowEx函数。这个函数的参数包括窗口类名、窗口标题、窗口样式、窗口位置和大小等信息,其中窗口位置和大小是可选的。
HWND hWnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
szWindowClass,
_T("Hello, World!"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 500,
nullptr,
nullptr,
hInstance,
nullptr);
if (!hWnd)
{
MessageBox(nullptr,
_T("Call to CreateWindowEx failed!"),
_T("Win32 Desktop App"),
MB_ICONERROR);
return 1;
}
这里我们通过CreateWindowEx函数创建了一个基本的窗口实例,并将其赋值给了hWnd变量,用于后续的操作。
5. 显示窗口实例和消息循环
窗口实例创建成功后,为了看到窗口,我们需要将其显示出来。这个可以通过ShowWindow函数实现。然后,我们需要进入消息循环,在程序窗口未关闭之前,程序都会不断地循环接收消息,处理消息,再接收消息,处理消息的过程。
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);
// Main message loop:
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
这里我们首先通过ShowWindow函数将窗口实例显示出来,并使用UpdateWindow函数更新窗口。然后进入一个while循环,不断调用GetMessage函数等待消息,然后将消息转换并分发到对应的窗口过程函数进行处理。
示例1:一个简单的窗口程序
下面是一个简单的窗口程序示例,它创建了一个基本的窗口实例,并在窗口中显示“Hello, World!”这个字符串。
#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
const TCHAR szWindowClass[] = _T("DesktopApp");
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(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = nullptr;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
if (!RegisterClassEx(&wcex))
{
MessageBox(nullptr,
_T("Call to RegisterClassEx failed!"),
_T("Win32 Desktop App"),
MB_ICONERROR);
return 1;
}
HWND hWnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
szWindowClass,
_T("Hello, World!"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 500,
nullptr,
nullptr,
hInstance,
nullptr);
if (!hWnd)
{
MessageBox(nullptr,
_T("Call to CreateWindowEx failed!"),
_T("Win32 Desktop App"),
MB_ICONERROR);
return 1;
}
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);
// Main message loop:
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
示例2:带按钮的窗口程序
下面是一个稍微复杂一点的窗口程序示例,它创建了带有一个按钮的窗口实例,并使用对应的窗口过程函数处理按钮点击事件。
#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);
const TCHAR szWindowClass[] = _T("DesktopApp");
const TCHAR szWindowTitle[] = _T("Hello, World!");
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
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(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = nullptr;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
if (!RegisterClassEx(&wcex))
{
MessageBox(nullptr,
_T("Call to RegisterClassEx failed!"),
_T("Win32 Desktop App"),
MB_ICONERROR);
return 1;
}
HWND hWnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
szWindowClass,
szWindowTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 500,
nullptr,
nullptr,
hInstance,
nullptr);
if (!hWnd)
{
MessageBox(nullptr,
_T("Call to CreateWindowEx failed!"),
_T("Win32 Desktop App"),
MB_ICONERROR);
return 1;
}
// Create a button
HWND hWndButton = CreateWindow(
_T("BUTTON"),
_T("Click me"),
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
10, 10,
100, 30,
hWnd,
(HMENU) 1,
(HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE),
nullptr);
if (!hWndButton)
{
MessageBox(nullptr,
_T("Call to CreateWindow failed!"),
_T("Win32 Desktop App"),
MB_ICONERROR);
return 1;
}
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);
// Main message loop:
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
OnCommand(hWnd, LOWORD(wParam), (HWND) lParam, HIWORD(wParam));
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch (id)
{
case 1:
MessageBox(hWnd,
_T("Hello, World!"),
_T("Greetings"),
MB_OK);
break;
default:
break;
}
}
在上面的例子中,我们首先创建了一个标题为“Hello, World!”的窗口实例,然后通过CreateWindow函数创建了一个按钮,并设置其位置和大小和按钮上的文本,接着我们注册了窗口过程函数,在过程函数中对按钮事件进行处理,最后在消息循环中调用GetMessage函数,等待用户输入和系统事件的触发。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言创建windows窗口实例 - Python技术站