创建控制台程序的时候,需要手动创建一个窗口的实例,来显示程序的输出信息。下面是创建VC中控制台程序的窗口实例的完整攻略:
- 首先需要包含Windows API的头文件"Windows.h",和"CRT"的头文件"Stdio.h";
#include <stdio.h>
#include <Windows.h>
- 在控制台程序中,一般是通过WinMain函数或main函数来执行程序的,我们可以定义一个WinMain函数来创建窗口,并在窗口中输出信息。这里我们主要使用到Windows API中的CreateWindow()函数来创建窗口实例,初始化窗口信息,以及定义窗口处理函数并接收Windows消息,再根据消息类型进行相应的处理。
下面是一个简单的示例:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASSEX wce;
HWND hwnd;
MSG msg;
//定义窗口类
wce.cbSize = sizeof(WNDCLASSEX);
wce.style = CS_HREDRAW | CS_VREDRAW;
wce.lpfnWndProc = WndProc;
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hInstance = hInstance;
wce.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wce.hCursor = LoadCursor(NULL,IDC_ARROW);
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wce.lpszMenuName = NULL;
wce.lpszClassName = "Window Class";
wce.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
//注册窗口类
RegisterClassEx(&wce);
//创建窗口
hwnd = CreateWindowEx(
0,
"Window Class",
"Hello,World!",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
//显示窗口
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
//消息循环
while ( GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//窗口处理函数定义
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;
}
上面的示例中,首先定义了一个WNDCLASSEX结构体,来初始化窗口类的信息,然后注册窗口类。在创建窗口的时候,传递的参数包括窗口类的名字,窗口标题,风格等。然后定义了一个消息循环,来处理窗口事件。窗口处理函数WndProc接受到Windows消息后,根据不同的消息类型进行相应的处理。在示例中,当用户单击关闭按钮时,系统会向窗口发送WM_CLOSE消息,程序就会调用WindowProc函数来处理这个消息,销毁窗口。当应用程序(通过PostQuitMessage函数)向系统发送WM_QUIT消息来停止消息循环时,程序将会接收到WM_DESTROY消息,这时也需要调用WindowProc来处理这个消息,释放相关资源并真正退出程序。
- 另外一个示例是在控制台程序中创建一个简单的窗口,在窗口中显示一张图像。代码如下:
#include <stdio.h>
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASSEX wce;
HWND hwnd;
MSG msg;
//定义窗口类
wce.cbSize = sizeof(WNDCLASSEX);
wce.style = 0;
wce.lpfnWndProc = WndProc;
wce.cbClsExtra = 0;
wce.cbWndExtra = 0;
wce.hInstance = hInstance;
wce.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wce.hCursor = LoadCursor(NULL,IDC_ARROW);
wce.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wce.lpszMenuName = NULL;
wce.lpszClassName = "Window Class";
wce.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
//注册窗口类
RegisterClassEx(&wce);
//创建窗口
hwnd = CreateWindowEx(
0,
"Window Class",
"My Image Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
//显示窗口
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
//消息循环
while ( GetMessage(&msg, NULL, 0, 0) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//窗口处理函数定义
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HBITMAP hBitmap;
HINSTANCE hInstance;
switch(msg)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hInstance = GetModuleHandle(NULL);
hBitmap = LoadBitmap(hInstance,"res\\dog.bmp");
// 使用StretchBlt函数绘制图像
StretchBlt(hdc,0,0,300,300,
hBitmap,0,0,260,245,SRCCOPY);
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
在这个示例中,我们在窗口处理函数WndProc中,处理WM_PAINT消息,在这个消息中我们绘制了一个位图文件从而在窗口中显示图像。具体的绘图函数是StretchBlt函数。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:VC中控制台程序创建窗口的实例方法 - Python技术站