学习C++在windows下窗口应用程序开发(一)

在网上有幸找到孙鑫老师的C++视频,先让我膜拜一下,看到视频是免费的,所以分享一下URL应该没什么事情吧,偷摸的。。。。emmmmmm
好了,还是进入正题吧,毕竟这是我第一次写博客,也是很激动的呢!!!

————我是可爱的分割线——————————————————————

Windows下窗口的编程用的最多的就是C++,首先要理解windows程序的内部运行原理,上图:
Windows是通过消息循环机制(Message)来进行运行的,人与计算机之间交互的方式是通过操作系统,也就是说应用程序和输入输出设备之间交互的方式就是操作系统,媒介就类似于我们在写控制台程序时的函数调用机制一样,这里Windows封装好了许多,也就是Windows API。

与控制台程序一样,在编写窗口程序时也需要有主函数,也就是入口函数,与控制台不同的是,这里的主函数格式如下:
int WINAPI WinMain(HINSTANCE hInstance,    //当前句柄
                HINSTANCE hPrevInstance,        //上一个实例句柄
                LPSTR lpCmdLine,             //命令行参数
               int nShowCmd);       //显示窗口的情况
在MSDN中lpCmdLine的类型为LPWSTR,但是复制到程序中运行出错,原因是 WinMain函数的原始定义中lpCmdLine的类型是char *,但在中文系统的环境下因为启用了Unicode支持,LPTSTR代表的是WCHAR *。

创建一个完整的窗口程序需要四个步骤:
1.设计一个窗口类

2.注册窗口类


3.创建窗口

4.显示及更新窗口

学习第一天写的程序如下:
#include <windows.h>
#include <stdio.h>


LRESULT CALLBACK WinSunProc(HWND hwnd, UINT uMsg, WPARAM wParam,
	LPARAM lParam);    //回调函数


int WINAPI WinMain(HINSTANCE hInstance,
	               HINSTANCE hPrevInstance,
	               LPSTR lpCmdLine,
	               int nShowCmd) 
{
	WNDCLASS wndcls;    //实例化
	wndcls.cbClsExtra = 0;   //额外的类的附加字节数
	wndcls.cbWndExtra = 0;   //窗口额外的附加字节数
	wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);  //背景颜色,GetStockObject()函数的返回值是一个HGDIOBJ格式的,强制转换成HBRUSH格式的赋值
	wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);  //光标的类型
	wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);   //图标
	wndcls.hInstance = hInstance;              //应用程序的实例号
	wndcls.lpfnWndProc = WinSunProc;       //窗口过程函数
	wndcls.lpszClassName = "热爱游戏";  //类名
	wndcls.lpszMenuName = NULL;   //菜单名
	wndcls.style = CS_HREDRAW | CS_VREDRAW; //水平重画和垂直重画


	RegisterClass(&wndcls);   //注册窗口类


	HWND hwnd;   //实例化一个句柄
	hwnd = CreateWindow("热爱游戏","我喜欢玩儿游戏!!!",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_s(szChar,"char is %d",wParam);    //sprintf_s和sprintf的区别
		MessageBox(hwnd, szChar,"游戏",0);
		break;
	case WM_LBUTTONDOWN:
		MessageBox(hwnd,"mouse clicked","游戏",0);
		HDC hdc;
		hdc = GetDC(hwnd);
		TextOut(hdc, 0, 50, "我为游戏狂", strlen("我为游戏狂"));
		ReleaseDC(hwnd, hdc);
		break;
	case WM_PAINT:
		HDC hDC;
		PAINTSTRUCT ps;
		hDC = BeginPaint(hwnd,&ps);
		TextOut(hDC,0,0,"我喜欢玩儿黑暗之魂3",strlen("我喜欢玩儿黑暗之魂3"));
		EndPaint(hwnd,&ps);
		break;
	case WM_CLOSE:
		if (IDYES==MessageBox(hwnd,"是否真的结束?","游戏",MB_YESNO))
		{
			DestroyWindow(hwnd);  //销毁窗口
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd,uMsg,wParam,lParam);
	
	
	}
	return 0;
   

}




sprintf和sprintf_s的区别就在于安全性的问题, sprintf_s对于格式化string中的格式化的字符的有效性进行了检查,而sprintf仅仅检查格式化string或者缓冲区是否是空指针。如果有错误则返回相应的错误代码。


今天的学习给我的感觉就是从控制台的大坑跳进了窗口的巨坑!!!但是我一定要克服懒惰,相信自己,以后要养成写博客的好习惯,加油!!!
  • 40
    点赞
  • 178
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值