C语言入门以后,感觉现在用C语言编DOS程序实用价值很低,应该编一些有实用价值windows平台的程序来增加一下我学习编程的兴趣。于是今天把孙鑫老师的VC++视频教程下载下来,准备学习下VC++。看完了第一章,感觉没有想象中那么难,只是在C语言基础上运用WINDOWS API函数按照一定的流程编写就行了,于是我试着编写了我windows平台下的第一个程序,原来windows平台下编程这么简单,几个函数就出来一个窗口,真是没有想到。
VC++第一章
windows程序运行原理与编写流程学习笔记
#include <windows.h> // 窗口应用程序头文件
#include <stdio.h> // DOS应用程序头文件
LRESULT CALLBACK WinSunProc( // 窗口过程函数
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息接收函数
WPARAM wParam, // 消息附加参数
LPARAM lParam // 消息附加参数2
);
int WINAPI WinMain( // windows程序入口函数
HINSTANCE hInstance, // 实例号
HINSTANCE hPrevInstance, // 此参数在win32系统中总是为空
LPSTR lpCmdLine, // 命令行参数
int nCmdShow // 显示状态,比如最大化,最小化
)
{
WNDCLASS wndcls; // 定义窗口类变量
wndcls.cbClsExtra=0; // 给类分配一个附加内存,通常为0
wndcls.cbWndExtra=0; // 给窗口分配一个附加内存,通常为0
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); // 设置窗口背景,GetStockObject()函数可以获取一个笔,画刷,字体,调色板的句柄,(HBRUSH)为强制转化
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); // 设置光标
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); // 设置图标
wndcls.hInstance=hInstance; // 选择实例
wndcls.lpfnWndProc=WinSunProc; // 指定窗口过程函数
wndcls.lpszClassName="win32"; // 窗口类型名字
wndcls.lpszMenuName="Null"; // 窗口菜单名字
wndcls.style=CS_HREDRAW | CS_VREDRAW; // 选择窗口类型 CS_HREDRAW(水平重画) CS_VREDRAW(垂直重画)
RegisterClass(&wndcls); // 注册窗口类
HWND hwnd; // 定义窗口句柄
hwnd=CreateWindow("win32","我第一个窗口程序",WS_OVERLAPPEDWINDOW,200,200,800,600,NULL,NULL,hInstance,NULL);
// 创建一个窗口
ShowWindow(hwnd,SW_SHOWNORMAL); // 显示窗口
UpdateWindow(hwnd); // 更新窗口
MSG msg; // 定义消息变量
while(GetMessage(&msg,NULL,0,0)) // 获取消息,如果为真继续循环,如果为假退出循环
{
TranslateMessage(&msg); // 转换消息,生成WM_CHAR消息
DispatchMessage(&msg); // 发送消息到过程函数处理
}
return 0;
}
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_LBUTTONDOWN: // 左键点击
MessageBox(hwnd,"你点击了左键","test",MB_OK);
break;
case WM_RBUTTONDOWN: // 右键点击
MessageBox(hwnd,"你点击了右键","test",MB_OK);
break;
case WM_PAINT: // 刷新
HDC hdc; // 定义一个设备描述句柄
PAINTSTRUCT ps; // 定义一个刷新结构体,用户无需了解
hdc=BeginPaint(hwnd,&ps); // 开使刷新
TextOut(hdc,100,50,"我第一个VC程序窗口,Yeah!成功了!",strlen("我第一个VC程序窗口,Yeah!成功了!"));
EndPaint(hwnd,&ps); // 结束刷新
break;
case WM_CLOSE: // 窗口关闭
if(IDYES==MessageBox(hwnd,"你真的要退出吗?","test",MB_YESNO))
{
DestroyWindow(hwnd); // 销毁窗口(但程序不销毁)
}
break;
case WM_DESTROY: // 如果接到窗口销毁消息
PostQuitMessage(0); // 发送一个退出消息
break;
default: // 其它消息让windows默认处理(必须加)
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0; //
}
需要注意的几点:
1、如果一个函数中不想包括哪些功能,用~符号加上不想要的功能参数,进行与运算即可。
2、==运算符使用时尽量把常量放在左边,这样万一打错符号也可以很快查出错误。
3、WM_PAINT是刷新重画消息,不在此消息处理过程中的显示文字和图片,窗口刷新后将消失。
需要注意的几点:
1、如果一个函数中不想包括哪些功能,用~符号加上不想要的功能参数,进行与运算即可。
2、==运算符使用时尽量把常量放在左边,这样万一打错符号也可以很快查出错误。
3、WM_PAINT是刷新重画消息,不在此消息处理过程中的显示文字和图片,窗口刷新后将消失。