VC++深入学习1


windows下利用VC6的应用程序编写,

再利用MSDN,写出一个窗口。


首先明确一个过程  : 

1.用户发出需求(例如按下键盘某个键)

2.操作系统感知到I/O设备,将用户需求包装成一个消息,投递(post,记单词,很有用)到消息队列中

3.应用程序从自己的消息队列中取走消息,并对它作出响应(既然是队列,肯定满足FIFO)

4.程序响应后,通知操作系统,操作系统根据程序的的命令来控制I/O设备


注意几个点:

1.每个windows程序开始后,系统会为这个程序创建消息队列

2.消息是用MSG结构体来表示,定义参见MSDN

3.程序的入口时WinMain函数,一个程序一开始执行,操作系统调用的就是该程序的WinMain函数。

4.作为程序员,不需要了解操作系统是如何与硬件打交道的(//可是我是学电子的,我还是得知道T.T)

我们只要在程序中调用windows系统提供的API,就可完成windows应用程序的编写,当然不同系统有不同的API,就像不同单片机对应不同的汇编语言一样

5.有时候这些API就和芯片中的端口寄存器一样,只要对它某一位赋值就可以让它做出不同功能,微命令由操作系统自己完成。(例如设计窗口类的style变量)



下面给出一个例子,自己编写winmain函数,创建一个最简单的窗口,

步骤

1.定义winmain函数

2.创建窗口

3.消息循环

4.编写窗口过程函数




#include<windows.h>
#include<stdio.h>
LRESULT CALLBACK lymproc(
						 HWND hwnd,      // handle to window
						 UINT uMsg,      // message identifier
						 WPARAM wParam,  // first message parameter
						 LPARAM lParam   // second message parameter
						 );

int WINAPI WinMain(
				   HINSTANCE hInstance,      // handle to current instance
				   HINSTANCE hPrevInstance,  // handle to previous instance
				   LPSTR lpCmdLine,          // command line
				   int nCmdShow              // show state
)
{
	WNDCLASS wndcls;
	wndcls.cbClsExtra=0;
	wndcls.cbWndExtra=0;
	wndcls.hbrBackground=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
	wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
	wndcls.hIcon=LoadIcon(NULL,IDI_INFORMATION);
	wndcls.hInstance=hInstance;
	wndcls.lpfnWndProc=lymproc;//
	wndcls.lpszClassName="LymWindows";
	wndcls.lpszMenuName=NULL;
	wndcls.style=CS_HREDRAW|CS_VREDRAW;
	RegisterClass(&wndcls);

	HWND hwnd;
	hwnd=CreateWindow("LymWindows","Hello",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,600,400,NULL,NULL,hInstance,NULL);
	ShowWindow(hwnd,SW_SHOWNORMAL);
	UpdateWindow(hwnd);
	//	SendMessage(hwnd,WM_LBUTTONDOWN,0,0);//可以直接给窗口发送消息,不经过消息队列
	//	PostMessage(hwnd,WM_LBUTTONDOWN,0,0);//post是投到消息队列中
	MSG msg;
	//消息循环
	while(GetMessage(&msg,NULL,0,0))//不断从消息队列取出消息,只有收到WM_QUIT消息才为0,PostQuitMessage(0)可以投递一个WM_QUIT消息
	{
		TranslateMessage(&msg);//将虚拟键消息转化为字符消息投入消息队列,与键盘输入相关
		DispatchMessage(&msg);//分派一个消息到窗口过程,系统调用窗口过程函数响应消息

	}

return 0;
}

//编写窗口过程函数



LRESULT CALLBACK lymproc(
		HWND hwnd,      // handle to window
		UINT uMsg,      // message identifier
		WPARAM wParam,  // first message parameter
		LPARAM lParam   // second message parameter
						 )
	{

		switch (uMsg)
		{
		case WM_CHAR://WM_CHAR才能表示字符,如果是WM_KEYDOWN,那就无法区分功能键还是字符键了
			char s[20];
			sprintf(s,"char code is %d",wParam);
			MessageBox(hwnd,s,"hello ",MB_OK);
			break;
		case WM_PAINT:
			HDC h1;
			PAINTSTRUCT ps;
			h1=BeginPaint(hwnd,&ps);//只能在响应WM_PAINT消息时可以用beginpaint
			TextOut(h1,0,0,"林一鸣窗口程序1",strlen("林一鸣窗口程序1"));
			EndPaint(hwnd,&ps);
			ReleaseDC(hwnd,h1);
			break;
		case WM_LBUTTONDOWN:
			MessageBox(hwnd,"you have clicked left button!","NOTICE",MB_OK);
			break;
		

		case WM_CLOSE:
			DestroyWindow(hwnd);//销毁窗口,但是不退出程序
			PostQuitMessage(0);

			break;

		case WM_DESTROY://退出时,必须要响应destroy消息
			PostQuitMessage(0);
			break;

		default:
			return DefWindowProc(hwnd,uMsg,wParam,lParam);//对不进行特别响应的消息,则由系统默认的函数进行响应
		}
		
		return 0;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值