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
阅读全文
0 0
- windows可视化编程(五)
- windows可视化编程(一)
- windows可视化编程(二)
- windows可视化编程(三)
- windows可视化编程(四)
- windows可视化编程(6)
- Win32 Windows编程 五
- 《Windows核心编程》读书笔记 (五)
- 初识windows编程之五
- Windows系统编程(五):Windows内存
- 可视化编程
- 可视化编程
- 可视化编程
- 可视化编程
- 可视化编程
- 实例:Windows标准控件在可视化编程中的应用
- Windows核心编程<读书笔记五>作业JOB
- windows编程之五 First Window
- Piggy-Bank HDU
- 剑客决斗(flag)
- shiro学习(一)
- nopCommerce 3.9 大波浪系列 之 路由扩展 [多语言Seo的实现]
- 学习Cocos的一些链接
- windows可视化编程(五)
- bzoj 3531(树链剖分)
- CentOS配置samba服务
- Zookeeper_的特性
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 计算机网络概述
- java map接口
- ProtoBuffer 描述规则
- JDBC:java数据库连接