zoukankan      html  css  js  c++  java
  • Windows程序

         Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。每个窗口都有一个消息处理函数。在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。
         客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,就会去调用这个消息处理函数。通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,其他的,则送回到系统的缺省消息处理函数中去。系统会将针对这个程序的消息依次放到程序的“消息队列”中,由程序自己依次取出消息,在分发到对应的窗口中去。
         因此,建立窗口后,将进入一个循环。在循环中,取出消息、派发消息,循环往复,直到取得的消息是退出消息。循环退出后,程序即结束。

    下面是一个相应鼠标左键单击事件的小示例:

    01

    02

    03

    04 

    #include <windows.h>
    
    void InitApplication(HINSTANCE);
    BOOL InitInstance(HINSTANCE,int);
    LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
    
    
    /********************************************
     * WinMain			主程序入口				*
     ********************************************
     * hInstance		面向应用程序的当前句柄	*
     * hPrevInstance	此时的当前句柄			*
     * lpCmdLine		命令行的字符串			*
     * nCmdShow			启动时的显示方式		*
     ********************************************/
    int WINAPI WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    	MSG msg;
    	MessageBox(GetFocus(),"Hello world!","Message",MB_OK);
    	//MessageBox(NULL,"Hello world!","Message",MB_OK);
    	//MessageBox(NULL,lpCmdLine,"CmdLine",0);
    	InitApplication(hInstance);
    	if(InitInstance(hInstance,nCmdShow))
    	{
    		//return 0;
    		while(GetMessage(&msg,(HWND)NULL,(UINT)NULL,(UINT)NULL))
    		{
    			TranslateMessage(&msg);	
    			DispatchMessage(&msg);
    		}
    	}
    	return (msg.wParam);
    }
    
    /************************************
     * InitApplication  初始化程序		*
     ************************************
     * hInstance		面对应用的句柄	*
     ************************************/
    void InitApplication(HINSTANCE hInstance)
    {
    	// 注册窗口类
    	WNDCLASSEX wc;
    	wc.cbSize=sizeof(wc);
    	wc.style=CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc=(WNDPROC)MainWndProc;
    	wc.cbClsExtra=0;
    	wc.cbWndExtra=0;
    	wc.hInstance=hInstance;
    	wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    	wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    	wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    	wc.lpszMenuName=NULL;
    	wc.lpszClassName="MainClass";
    	wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
    	if (!RegisterClassEx(&wc))
    	{
    		MessageBox (NULL, TEXT ("RegisterClass Fail!"), 
    		“Message”, MB_ICONERROR) ;
    	}
    }
    
    /********************************
     * InitInstance 初始化窗口		*
     ********************************
     * hInstance	面对应用的句柄	*
     * nCmdShow		启动时的显示方法*
     ********************************/
    BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
    {
    	HWND hWnd;
    	hWnd=CreateWindow("MainClass", // 窗口类名称
    					  "Image Processing",// 窗口标题
    					  WS_OVERLAPPEDWINDOW, // 窗口风格
    					  CW_USEDEFAULT, // 窗口位置大小
    					  CW_USEDEFAULT,
    					  CW_USEDEFAULT,
    					  CW_USEDEFAULT,
    					  NULL, // 父視窗的 handle,若本視窗是父視窗,則設為 NULL
    					  NULL, // 選單的 handle
    					  hInstance, // 主程式句柄
    					  NULL); // 額外資料的指標,若無額外資料通常都設為 NULL
    	if (hWnd==NULL)
    		return (FALSE);
    	ShowWindow(hWnd,nCmdShow);
    	UpdateWindow(hWnd);
    	return TRUE;
    }
    
    /****************************
     * MainWndProc  信息的处理	*
     ****************************
     * hWnd			窗口		*
     * message		信息		*
     * wParam		字参数		*
     * lParam		长参数		*
     ****************************/
    LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	// 处理感兴趣的消息
    	switch (message)
    	{
    		// 鼠标左键按下事件
    		case WM_LBUTTONDOWN:
    			MessageBox(hWnd,"鼠标左键已被按下!","Message",MB_OK);
    			break;
    
    		// 当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环
    		case WM_DESTROY:
    			MessageBox(GetFocus(),"Thank you for used!","Message",MB_OK);
    			PostQuitMessage(0);
    			break;
    
    		// 不感兴趣的消息转交给系统提供的缺省处理函数处理
    		default:
    			return DefWindowProc(hWnd,message,wParam,lParam);
    	}
    	return 0;
    }

  • 相关阅读:
    103、服务器出现大量close_wait的连接的原因是什么?有什么解决方法?
    102、常见的HTTP状态码有哪些?
    rpm包管理、yum源及创建本地仓库(同步华为源)
    文件管理之:输出与重定向echo
    高级权限--acl, mask,文件属性权限;su切换用户,sudo提权
    基本权限;权限对⽂件or⽬录的意义;特殊权限;文件权限之umask
    权限管理--用户介绍;用户与组相关文件;用户管理命令之用户创建、查看、删除、修改
    文件管理之:打包、压缩
    字符处理命令-sort排序,uniq去重,cut剪切文件,tr删除或替换结果集,wc统计
    上传与下载wget、curl、r z、s z
  • 原文地址:https://www.cnblogs.com/herbertchina/p/3272985.html
Copyright © 2011-2022 走看看