实验目的
-
了解 windows操作系统应用程序开发的基本概念,win32 API函数、消息与事件驱动;
-
掌握WinMain函数的基本框架,窗口定义、窗口创建、消息循环及窗口过程函数;
实验过程
- 设计一个窗口类
- 注册窗口类
- 创建窗口
- 显示及更新窗口
- 消息循环
- 窗口过程函数
//窗口代码实例//
#include<windows.h>
#include <stdio.h>
//回调函数,这里也叫窗口函数,来执行窗口的消息循环,在建立窗口类的时候,可以指明窗口函数地址
LRESULT CALLBACK WinSunProc(
HWND hwnd, // 窗口句柄,要对窗口进行操作首先要得到这个窗口的句柄
UINT uMsg, // 消息标识符
WPARAM wParam,
LPARAM lParam
);
// WinMain函数,程序入口点函数
int WINAPI WinMain(
HINSTANCE hInstance, // HINSTANCE 是“句柄型”数据类型。当前实例的句柄
HINSTANCE hPrevInstance, // 先前实例的句柄
LPSTR lpCmdLine, // lpCmdLine是一个以空终止的字符串,指定传递给应用程序的命令行参数
int nCmdShow // 指定窗口如何显示
)
{
WNDCLASS wndcls; //实例化
wndcls.cbClsExtra=0; //额外的类的附加字节数
wndcls.cbWndExtra=0; //窗口额外的附加字节数
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); //背景颜色
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); //光标的类型 IDC_CROSS代表十字光标
wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION); //图标
wndcls.hInstance=hInstance; //应用程序的实例号
wndcls.lpfnWndProc=WinSunProc; //窗口过程函数
wndcls.lpszClassName="homework"; //类名
wndcls.lpszMenuName=NULL; //菜单名
wndcls.style=CS_HREDRAW | CS_VREDRAW; //水平重画和垂直重画
RegisterClass(&wndcls); //注册窗口类
HWND hwnd; //实例化一个句柄
hwnd=CreateWindow("homework","http://www.homework.org",WS_OVERLAPPEDWINDOW,
0,0,600,400,NULL,NULL,hInstance,NULL); //建立一个窗口
ShowWindow(hwnd,SW_SHOWNORMAL); //显示窗口
UpdateWindow(hwnd); //更新窗口
MSG msg; //消息机制
while(GetMessage(&msg,NULL,0,0)) //消息循环
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
MessageBox(hwnd,szChar,"char",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","message",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"第一个作业",strlen("第一个作业"));
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"http://www.sunxin.org",strlen("http://www.sunxin.org"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","message",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
实验结果