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;
}