windows可视化编程(五)


这章总结一下资源的编写。

资源主要 分为五个部分,分别是菜单,加速键,位图,对话框和图标。

①首先看菜单和加速键的操作,菜单再资源文件编写范例如下:

#include "c:\prog_book\7_1\7_1.h"
#include "windows.h"
MENU MENU DISCARDABLE 
BEGIN
    POPUP "文件(&F)"
    BEGIN
        MENUITEM "创建统计计算菜单项(&P)\t Ctrl+P", IDM_ADDMENU
        MENUITEM "删除统计计算菜单项(&D)\t Ctrl+D", IDM_DELMENU, GRAYED
        MENUITEM SEPARATOR
        MENUITEM "退出(&X)",                    IDM_EXIT
    END
    MENUITEM "帮助(&H)",                    IDM_HELP

END



MENU ACCELERATORS MOVEABLE PURE 
BEGIN
    "^P",           IDM_ADDMENU,			ASCII   
    "^D",           IDM_DELMENU,			ASCII   
END

期中IDM_ADDMENU 这些都是自己定义的表示,其实都是数字,需要再头文件声明,再看下主函数

#include "windows.h"                      
#include "7_1.h"

HMENU hmenu,haddmenu; //定义菜单句柄
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{	
	HWND hwnd ;
	MSG Msg ;
	HACCEL hAccel;
	WNDCLASS wndclass ;
	char lpszMenuName[]="Menu";
	char lpszClassName[] = "菜单"; 
	char lpszTitle[]= "My_Menu_Example";
	wndclass.style = 0;                   
	wndclass.lpfnWndProc = WndProc;    
	wndclass.cbClsExtra	= 0;          
	wndclass.cbWndExtra	= 0;          
	wndclass.hInstance = hInstance;       
	wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION);   
	wndclass.hCursor = LoadCursor( NULL, IDC_ARROW);   
	wndclass.hbrBackground =(HBRUSH) GetStockObject( WHITE_BRUSH);   	
	wndclass.lpszMenuName =  lpszMenuName ;		//加载窗口类菜单                       
	wndclass.lpszClassName = lpszClassName ;                   
	if( !RegisterClass( &wndclass))       
		{
			MessageBeep(0) ;
			return FALSE ;
		}

hwnd = CreateWindow(lpszClassName,     
					lpszTitle,     
					WS_OVERLAPPEDWINDOW,   
					CW_USEDEFAULT, 
              	    CW_USEDEFAULT,
                   	CW_USEDEFAULT,
                    CW_USEDEFAULT,    
					NULL,       
					NULL,      
					hInstance,    
					NULL) ;      

ShowWindow( hwnd, nCmdShow) ;
UpdateWindow(hwnd); 

//加载加速键资源
hAccel=LoadAccelerators(hInstance,lpszMenuName);      
while( GetMessage(&Msg, NULL, 0, 0))
	{  
		//在消息循环中截获加速键消息
		if (!TranslateAccelerator(hwnd,hAccel,&Msg))
   			{
				TranslateMessage( &Msg) ;
				DispatchMessage( &Msg) ;
			} 
	}

		return Msg.wParam;      
}
    
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM  wParam,LPARAM  lParam)
{
	switch(message)
	{
   		//处理菜单消息	   
   		case WM_COMMAND:
			switch(LOWORD(wParam))
				{
  					case IDM_ADDMENU://在主菜单中添加弹出式统计计算菜单
       					//获取主菜单句柄
						hmenu=GetMenu(hwnd);
						//动态创建菜单
						haddmenu=CreateMenu();
						//在创建的菜单中增加菜单项
						AppendMenu(haddmenu,MF_ENABLED,IDM_qiuhe,"求和");
        				AppendMenu(haddmenu,MF_ENABLED,IDM_fangcha,"方差");
						AppendMenu(haddmenu,MF_ENABLED,IDM_pinjunzhi,"平均值");
					    AppendMenu(haddmenu,MF_ENABLED,IDM_junfanggen,"均方根");
	       				//将创建的弹出式菜单插入主菜单中
						InsertMenu(hmenu,2,MF_POPUP|MF_BYPOSITION,(UINT)haddmenu,"统计计算(&C)");
        				//相应改变菜单中有关绘图统计计算菜单项的属性
						EnableMenuItem(hmenu,IDM_ADDMENU,MF_GRAYED);
        				EnableMenuItem(hmenu,IDM_DELMENU,MF_ENABLED);
						//重新显示窗口菜单
						DrawMenuBar(hwnd);
						break;
       					//从主菜单中删除弹出式统计计算菜单
	   				case IDM_DELMENU:
        			    //删除统计计算菜单项
						DeleteMenu(hmenu,2,MF_BYPOSITION);
						//相应改变“文件”菜单中有关统计计算菜单项的属性
						EnableMenuItem(hmenu,IDM_ADDMENU,MF_ENABLED);
        				EnableMenuItem(hmenu,IDM_DELMENU,MF_GRAYED);
						//重新显示窗口菜单
        				DrawMenuBar(hwnd); 
						break;
		   		     case IDM_EXIT:
		      	         //选择“退出”菜单项时,向应用程序发出WM_DESTROY消息
			  	         SendMessage(hwnd,WM_DESTROY,0,0);
        			    break;
		 		}
	        break;	  
    			case WM_DESTROY:          
    				PostQuitMessage(0);   
    				break;  
    			default:                  
     				return  DefWindowProc(hwnd,message,wParam,lParam);			
   		}
   		return 0;
}
我们可以利用appendmenu动态创建菜单

加速键资源需要LoadAccelerators(hInstance,lpszMenuName)并重写消息获取函数

if (!TranslateAccelerator(hwnd,hAccel,&Msg))
   			{
				TranslateMessage( &Msg) ;
				DispatchMessage( &Msg) ;
			} 
 ②位图

主函数

#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

//定义变量
HDC hdc;			//设备环境句柄
HDC hdcmem;			//内存设备环境句柄
HBITMAP hBm;		//位图句柄
BITMAP bm;			//BITMAP结构

int WINAPI WinMain(	HINSTANCE hInstance,
						HINSTANCE hPrevInst,
						LPSTR lpszCmdLine,
						int nCmdShow)
 {	
   HWND hwnd ;
   MSG Msg ;
   WNDCLASS wndclass ;

   char lpszClassName[] = "位图";
   char lpszTitle[]= "Example_For_BitMap";

        wndclass.style = 0;
		wndclass.lpfnWndProc = WndProc ;
		wndclass.cbClsExtra	= 0 ;
		wndclass.cbWndExtra	= 0 ;
		wndclass.hInstance = hInstance ;
		wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION) ;
		wndclass.hCursor = LoadCursor( NULL, IDC_ARROW) ;
		wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH) ;
		wndclass.lpszMenuName = NULL ;
		wndclass.lpszClassName = lpszClassName ;

	if( !RegisterClass( &wndclass))
	{
		MessageBeep(0) ;
		return FALSE ;
	}

	hwnd = CreateWindow(	lpszClassName,
							lpszTitle,
							WS_OVERLAPPEDWINDOW,
							CW_USEDEFAULT,
							CW_USEDEFAULT,
							CW_USEDEFAULT,
							CW_USEDEFAULT,
							NULL,
							NULL,
							hInstance,
							NULL) ;

//加载位图
hBm=LoadBitmap(hInstance,"pic7");

//获取位图尺寸
GetObject( hBm, sizeof( BITMAP), (LPVOID)&bm) ;

ShowWindow( hwnd, nCmdShow) ;
UpdateWindow(hwnd); 

while(	GetMessage(&Msg, NULL, 0, 0))
		{
			TranslateMessage( &Msg) ;
			DispatchMessage( &Msg) ;
		}

	return Msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM  wParam,LPARAM  lParam)
{	PAINTSTRUCT ps;

		switch(message)
		{

		case WM_CREATE:

		//获取设备环境句柄
		hdc=GetDC(hwnd);

		//获取内存设备环境句柄
		 hdcmem=CreateCompatibleDC(hdc);

		//释放设备环境句柄
		ReleaseDC(hwnd,hdc);

		case WM_PAINT:
		hdc=BeginPaint(hwnd,&ps);

		//将位图选入内存设备环境
		SelectObject(hdcmem,hBm);
		
	//调用函数BitBlt将内存设备环境中的位图拷贝到设备环境中
	BitBlt(hdc,180,80,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);

		//释放设备环境句柄
		EndPaint(hwnd,&ps);

break;

case WM_DESTROY:
		//释放位图
		DeleteObject(hBm);

		PostQuitMessage(0);
	break;

default:
		return  DefWindowProc(hwnd,message,wParam,lParam);
		}
		return 0;
}
资源文件

//位图示例.rc

	pic7 BITMAP pic7_2.bmp		//定义位图资源


③对话框


#include <windows.h>                      
#include "7_3.h"
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(	HINSTANCE hInstance,HINSTANCE hPrevInst,
					LPSTR lpszCmdLine,int nCmdShow)
{
		HWND hwnd ;
		MSG Msg ;
		HACCEL hAccel;
		WNDCLASS wndclass ;
    	char lpszMenuName[]="Menu";
    	char lpszClassName[] = "模态对话框"; 
    	char lpszTitle[]= "模态对话框样例";
    	wndclass.style = 0;                   
        wndclass.lpfnWndProc = WndProc ;    
		wndclass.cbClsExtra	= 0 ;          
		wndclass.cbWndExtra	= 0 ;          
		wndclass.hInstance = hInstance ;       
		wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION) ;   
    	wndclass.hCursor = LoadCursor( NULL, IDC_ARROW) ;   
    	wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH) ;   	
		wndclass.lpszMenuName =  lpszMenuName ;                       
		wndclass.lpszClassName = lpszClassName ;                   
   		if( !RegisterClass( &wndclass))       
	     {
			   MessageBeep(0) ;
			   return FALSE ;
	     }
		hwnd = CreateWindow(lpszClassName,     
						    lpszTitle,     
						    WS_OVERLAPPEDWINDOW,   
						    CW_USEDEFAULT, 
         		            CW_USEDEFAULT,
                        	CW_USEDEFAULT,
                        	CW_USEDEFAULT,    
							NULL,       
							NULL,      
							hInstance,    
							NULL);      

ShowWindow( hwnd, nCmdShow) ;
UpdateWindow(hwnd); 
hInst=hInstance;
hAccel=LoadAccelerators(hInst,lpszMenuName);      
while( GetMessage(&Msg, NULL, 0, 0))
 		{  
   		  if (!TranslateAccelerator(hwnd,hAccel,&Msg))
      		{
	   			TranslateMessage( &Msg) ;
	   			DispatchMessage( &Msg) ;
       		}
  		}
	return Msg.wParam;      
}
    
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM  wParam,LPARAM  lParam)
{
	switch(message)
	{
    	case WM_COMMAND:
			switch(LOWORD(wParam))
			  {
					case IDM_OPEN:			//打开文件操作
        					//文件打开成功则显示消息框
       					MessageBox(hwnd,"文件已经打开!","文件打开",MB_OK);
       					break;
   					case IDM_SAVE:			//存储操作
        					//文件保存成功则显示消息框
       					MessageBox(hwnd,"文件保存成功!","文件保存",MB_OK);
						break;
   					case IDM_EXIT:
      					SendMessage(hwnd,WM_DESTROY,0,0);
        				break;
   					case IDM_ABOUT:		   //创建对话框
						DialogBox(hInst,"About",hwnd,(DLGPROC)DlgProc);
						break;
			 }
             break;
		case WM_DESTROY:          
   			PostQuitMessage(0);   
   			break;   
        default:                  
     		return  DefWindowProc(hwnd,message,wParam,lParam);			
	 }
	 return 0;
}

      //对话框窗口处理函数
      BOOL CALLBACK DlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)
 		{
   		   switch(message)
   			{
     			//初始化对话框 
     			  case WM_INITDIALOG:
	    				return 1;

	 			//处理对话框消息 
	 			  case WM_COMMAND:
    				switch (LOWORD(wParam))
	      			  {
		   				case IDOK:              //关闭对话框  
			                EndDialog( hdlg, 0) ;
                            return 1;
                      }
		             break ;
				   case WM_CLOSE:
                      EndDialog( hdlg, 0) ;
			          return 1;
       	           }
                 return 0;
            }
  

可以利用messagebox之际弹出一个模态框,也可以自己在资源文件中定义:

     #include <windows.h>
     #include "7_3.h"

     Menu MENU DISCARDABLE 
      {  
       POPUP "文件(&F)"
         {   
          MENUITEM "打开(&O)\t Ctrl+O",     IDM_OPEN
          MENUITEM SEPARATOR                           
          MENUITEM "保存(&S)\t Ctrl+S",     IDM_SAVE
          MENUITEM SEPARATOR                           
          MENUITEM "退出(&X)",              IDM_EXIT
          }

      POPUP "帮助(&H)"
        {
         MENUITEM "关于(&A)...",          IDM_ABOUT
        }
      }   

    Menu ACCELERATORS  
     {
       "^O",             IDM_OPEN                  
       "^S",             IDM_SAVE                 
     }

    About DIALOG  10, 10, 100, 50
    STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU
     CAPTION "关于"
     FONT 18, "楷体"  //定义对话框中的文本字体类型及大小
        {
         CTEXT           "Windows模态对话框",-1,13,10,80,10
         DEFPUSHBUTTON   "确定",IDOK,35,30,30,12
        }

④ 图标
定义示例

TREE ICON C:\prog_book\7_6\tree.ico


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值