VC++深入学习1
来源:互联网 发布:vb语言基础 编辑:程序博客网 时间:2024/05/29 17:02
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 windowUINT uMsg, // message identifierWPARAM wParam, // first message parameterLPARAM 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消息时可以用beginpaintTextOut(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;}
- VC++深入学习1
- VC 深入详解 学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- 《VC++深入详解》学习笔记
- VC++深入详解的学习
- VC++深入详解的学习
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习记录
- VC++深入详解学习笔记
- vc++深入详解 1
- 《vc++深入详解》部分学习笔记
- VC++ 深入详解 学习笔记 对话框编程
- VC++深入详解第一章学习笔记
- . 不可以在主查询的group by后面放置子查询
- ASP.NET MVC2 同一view返回多个Model或数据集的方法
- eclipse中的org.eclipse.wst.server.core目录
- Python 常用命令
- POJ 1804 Brainman
- VC++深入学习1
- > --3. 可以在主查询的where select from having后面放置子查询 SQL> select empno,ename,(select job from emp where emp
- Python常用模块资料
- 远程桌面的IP地址系统自动存在哪里?
- py日志输出
- 表头不动 内容可滚动
- 编译内核是发现错误:undefined reference to `dm9000_initialize'
- linux shell 比较两个浮点数
- Python常用模块