windows可视化编程(五)

来源:互联网 发布:马蓉面相 知乎 编辑:程序博客网 时间:2024/05/22 16:58


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

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

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

#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_HELPENDMENU 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;}
资源文件

//位图示例.rcpic7 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


原创粉丝点击