Visual C++ Windows Programming

Slides:



Advertisements
Similar presentations
项目7 面向对象高级.
Advertisements

C语言程序设计 主讲教师 :张群燕 电话:
四資二甲 第三週作業 物件導向程式設計.
项目:贪吃蛇游戏设计 工作任务一:系统设计(system design) 工作任务二:豆类(Bean)设计
计算机高级程序设计 第五章.
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
基于VC++的数字图像特效处理系统的设计与实现
類別與物件 Class & Object.
第三章 控制结构.
第二十八章 開發新的VCL元件 雖然BCB內提供了很多VCL元件,但是一定還有一些我們常常需要用的介面並沒有製作成VCL元件,或是一些個人化的介面,我們也有需要做成VCL元件。在第十三章,我們將介紹如何自行開發新的VCL元件。
Ch02 視窗Swing套件 物件導向系統實務.
程式設計實作.
OOSDL 靜宜大學資工系 蔡奇偉 副教授
第二章 C# 基础知识.
第四章 在 C# 中实现 OOP 概念.
CAA 第一章 安装 1 安装CATIA。在安装CATIA时,要把它装到根目录下,文件夹名称不能含有空格,(在此命名为CATIA)安装完后,用crack文件下JS0GROUP.dll拷贝到d:\CATIA\B14\intel_a\code\bin下的覆盖。 2 安装vc。装vc时选自定义,把里面的所有组件都选上。
Basis基本操作、使用者 管理與權限設定
第十一章 面向对象设计 第十二章 面向对象实现
Android介面設計 Android智慧型手機程式設計 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2
K/3 Cloud 技术开发培训 ----BOS 业务插件开发
第4讲 Windows编程基础 此为封面页,需列出课程编码、课程名称和课程开发室名称。
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
本單元介紹何謂變數,及說明變數的宣告方式。
程式語言 I – VISUAL BASIC 選擇結構語法與應用 Chapter 7 認知
ANDROID PROGRAMMING2.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
第5章 文本与字体 2018/12/3 面向对象与可视化 程序设计 --Visual C++ 编程 主讲教师: 唐 龙教授 (计算机科学与技术系) 黄维通博士 (计算机与信息管理中心) 清 华 大 学 2001年2月 2018/12/3 Huang Weitong.
简要回顾 了解课程体系、课程目的和主要内容 掌握Windows编程涉及的一些主要概念 DOS程序和Windows程序的主要区别 窗口和程序
第1章 Windows应用程序框架的 创建与消息处理
第十一讲 MFC常用控件的使用(3) 严宣辉 数学与计算机科学学院
MFC WinSock类的编程 为简化套接字网络编程,更方便地利用Windows的消息驱动机制,微软的基础类库(Microsoft Foundation Class Libary,简称MFC),提供了两个套接字类,在不同的层次上对Windows Socket API函数进行了封装,为编写Windows.
网络游戏开发语言基础 ——Windows程序设计
VC++开发实例 张荣梅 2007年2月.
第四章 小技巧.
多媒體概論報告-BMP 組員名稱: 盧彥良-資料蒐集 周誠哲-資料蒐集
第4章 MFC编程 4.1 MFC概述 4.2 MFC和Win CObject类 4.4 消息映射的实现
MS Windows XP 作業系統使用操作簡介.
Visual C++ Windows Programming
C/C++/Java 哪些值不是头等程序对象
C#程序设计基础 第二章 数据类型.
Animation(動畫) 靜宜大學資工系 蔡奇偉 副教授
第三章 C# 基础知识.
第十五讲 MFC与消息处理 MFC简介 Windows编程机制 MFC应用程序框架原理 创建应用程序框架 消息及其分类 消息映射机制
版权所有 复制必究 第 6 章 MFC原理与方法.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
劉崇汎 崑山科技大學 電腦與通訊系 DLL的建立與引用 劉崇汎 崑山科技大學 電腦與通訊系
第11章 MATLAB图形用户界面设计 11.1 菜单设计 11.2 对话框设计 11.3 图形用户界面设计工具
C#程序设计基础 $3 成员、变量和常量.
第十二讲 菜单、工具栏和状态栏 严宣辉 数学与计算机科学学院
第三章 C++的语句和简单的程序设计 主要内容:
《面向对象程序设计与Visual C++6.0教程》
Visual C++ Windows Programming
MFC及其应用.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第5章 文本与字体 2019/4/25 面向对象与可视化 程序设计 --Visual C++ 编程 主讲教师: 唐 龙教授 (计算机科学与技术系) 黄维通博士 (计算机与信息管理中心) 清 华 大 学 2001年2月 2019/4/25 Huang Weitong.
功能表的建立 製作.
Visual C++ Windows Programming
第二章 Java语法基础.
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第10章媒体控制接口 10.1 MCI设备类型 10.2 MCI编程步骤 10.3使用MCIWnd窗口类.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶.
第2章 Java语言基础.
第二章 Java基本语法 讲师:复凡.
手工编写第一个 MFC程序 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
Presentation transcript:

Visual C++ Windows Programming 第四章 資源物件的使用

本章的準備 #include <afxwin.h> class CMyFrame : public CFrameWnd { private: public: CMyFrame() { Create(NULL, Resource Usage Demo"); } ~CMyFrame() { } afx_msg void OnLButtonDown(UINT nFlags, CPoint point) { SetCapture(); } afx_msg void OnMouseMove(UINT nFlags, CPoint point) { if(this == GetCapture()) { CClientDC aDC(this); aDC.SetPixel(point, RGB(255, 0, 0));

afx_msg void OnLButtonUp(UINT nFlags, CPoint point) { ReleaseCapture(); } DECLARE_MESSAGE_MAP() } ; BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd) ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() END_MESSAGE_MAP() class CMyApp : public CWinApp { public: BOOL InitInstance() { CFrameWnd *Frame = new CMyFrame; m_pMainWnd = Frame; Frame->ShowWindow(SW_SHOW); return true; } CMyApp a_app;

大綱 資源編輯器的操作 選單 (menu) 資源 熱鍵 (acc. table) 資源 工具列 (toolbar) 資源 UPDATE_COMMAND_UI 的觀念 狀態列 (status bar; 不是資源!) 與 字串表 (string table) 資源 點陣圖 (bitmap) 資源、圖示 (icon) 資源與游標 (cursor) 資源

資源編輯器的操作 新增資源物件 刪除資源物件 更改資源物件識別子與屬性 當工作區開啟 "Resource View" 時,在資源檔的圖示上按滑鼠右鍵,選取 Insert 選項,在 Insert Resource 對話盒中選取欲新增的資源物件,然後按下 New 按鈕。 刪除資源物件 在 Resource View 工作區點選欲刪除的資源,然後按下鍵盤的 Delete 鍵。 更改資源物件識別子與屬性 在 Resource View 工作區右鍵點選欲更改的物件,選取 Properties 選項,在對話盒中設定識別子與屬性。

選單資源 選單的組成 選單是視窗介面中,提供使用者選取指令的主要工具。一個應用程式的選單,通常由好幾個子選單所組成。在每一個子選單裡,將以分門別類的方式整理應用程式可提供執行的命令,方便使用者使用。 在應用程式裡,每一個選單或是選項都有一個 ID 代表,這個 ID 稱為該選單/選項的識別子,除了可以代表該選項之外,更進一步用於建立訊息映射項目,以連結選單選項所發出的訊息與欲觸發的訊息處理函數。

IDR_SMENU IDR_MAINMENU File Dynamic Switch IDM_SWITCHITEM Exit IDM_EXIT Create Item IDM_CREATEITEM IDR_INSMENU IDR_POPMENU Color Popup Red IDM_RED Item1 IDM_ITEM1 Green IDM_GREEN Item2 IDM_ITEM2 Blue IDM_BLUE

IDM_DELETEITEM IDM_NEWITEM IDM_INSERTITEM

#include <afxwin.h> #include "resource.h" class CMyFrame : public CFrameWnd { private: CMenu MainMenu, *SysMenu, *PopMenu, *SubMenu; COLORREF color; public: CMyFrame() { Create(NULL, "Menu Resource Demo", WS_OVERLAPPEDWINDOW | WS_VISIBLE, rectDefault, NULL, MAKEINTRESOURCE(IDR_SMENU)); SysMenu = GetSystemMenu(FALSE); color = RGB(255, 0, 0); } ~CMyFrame() { } afx_msg void OnSwitchItem() { CMenu InsMenu; InsMenu.LoadMenu(IDR_INSMENU); MainMenu.LoadMenu(IDR_MAINMENU); MainMenu.AppendMenu(MF_POPUP, (UINT) InsMenu.m_hMenu, "&Color Setting"); SubMenu = MainMenu.GetSubMenu(1); SubMenu->AppendMenu(MF_SEPARATOR); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_STRING, IDM_INSERTITEM, "&Insert Item"); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_POPUP, (UINT) InsMenu.m_hMenu, "Insert &submenu"); SetCheck(); InsMenu.Detach(); SetMenu(&MainMenu);

afx_msg void OnCreateItem() { MainMenu.ModifyMenu(IDM_CREATEITEM, MF_BYCOMMAND, IDM_DELETEITEM, "&Delete Item"); SubMenu = MainMenu.GetSubMenu(1); SubMenu->AppendMenu(MF_STRING, IDM_NEWITEM, "New Item"); } afx_msg void OnDeleteItem() { MainMenu.ModifyMenu(IDM_DELETEITEM, MF_BYCOMMAND, IDM_CREATEITEM, "&Create Item"); SubMenu->DeleteMenu(IDM_NEWITEM, MF_BYCOMMAND); afx_msg void OnContextMenu(CWnd *pWnd, CPoint point) { CMenu menu; menu.LoadMenu(IDR_POPMENU); PopMenu = menu.GetSubMenu(0); PopMenu->TrackPopupMenu(TPM_CENTERALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); menu.Detach(); afx_msg void OnRed() { SetUnCheck(); color = RGB(255, 0, 0); SetCheck(); afx_msg void OnGreen() { color = RGB(0, 255, 0);

afx_msg void OnBlue() { SetUnCheck(); color = RGB(0, 0, 255); SetCheck(); } void SetCheck() { switch(color) { case RGB(255, 0, 0): MainMenu.CheckMenuItem(IDM_RED, MF_BYCOMMAND | MF_CHECKED); break; case RGB(0, 255, 0): MainMenu.CheckMenuItem(IDM_GREEN, MF_BYCOMMAND | MF_CHECKED); case RGB(0, 0, 255): MainMenu.CheckMenuItem(IDM_BLUE, MF_BYCOMMAND | MF_CHECKED); void SetUnCheck() { MainMenu.CheckMenuItem(IDM_RED, MF_BYCOMMAND | MF_UNCHECKED); MainMenu.CheckMenuItem(IDM_GREEN, MF_BYCOMMAND | MF_UNCHECKED); MainMenu.CheckMenuItem(IDM_BLUE, MF_BYCOMMAND | MF_UNCHECKED);

afx_msg void OnLButtonDown(UINT nFlags, CPoint point) { SetCapture(); } afx_msg void OnMouseMove(UINT nFlags, CPoint point) { if(this == GetCapture()) { CClientDC aDC(this); aDC.SetPixel(point, color); } afx_msg void OnLButtonUp(UINT nFlags, CPoint point) { ReleaseCapture(); } DECLARE_MESSAGE_MAP() } ; BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd) ON_COMMAND(IDM_SWITCHITEM, OnSwitchItem) ON_COMMAND(IDM_CREATEITEM, OnCreateItem) ON_COMMAND(IDM_DELETEITEM, OnDeleteItem) ON_COMMAND(IDM_RED, OnRed) ON_COMMAND(IDM_GREEN, OnGreen) ON_COMMAND(IDM_BLUE, OnBlue) ON_WM_CONTEXTMENU() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() END_MESSAGE_MAP() class CMyApp : public CWinApp { public: BOOL InitInstance() { CFrameWnd *Frame = new CMyFrame; m_pMainWnd = Frame; Frame->ShowWindow(SW_SHOW); return true; CMyApp a_app;

加速鍵資源 加速鍵的使用 利用選單控制應用程式是一個相當方便且視覺化的方式,但在速度上卻較為緩慢。因此大多數的應用程式,都會設定加速鍵提供使用者另一個較為快速的程式操作途徑。 載入加速鍵列表需要呼叫的函式為 LoadAccelTable()。

Compare the Difference (work well) class CMyFrame : public CFrameWnd { private: ...; public: afx_msg void OnSwitchItem() { CMenu InsMenu; InsMenu.LoadMenu(IDR_INSMENU); MainMenu.LoadMenu(IDR_MAINMENU); MainMenu.AppendMenu(MF_POPUP, (UINT) InsMenu.m_hMenu, "&Color Setting"); SubMenu = MainMenu.GetSubMenu(1); SubMenu->AppendMenu(MF_SEPARATOR); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_STRING, IDM_INSERTITEM, "&Insert Item"); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_POPUP, (UINT) InsMenu.m_hMenu, "Insert &submenu"); LoadAccelTable(MAKEINTRESOURCE(IDR_ACCEL)); SetCheck(); InsMenu.Detach(); SetMenu(&MainMenu); } DECLARE_MESSAGE_MAP() } ;

Compare the Difference (not work) class CMyFrame : public CFrameWnd { private: ...; public: CMyFrame() { Create(NULL, "Message Processing Demo", WS_OVERLAPPEDWINDOW | WS_VISIBLE, rectDefault, NULL, MAKEINTRESOURCE(IDR_SMENU)); SysMenu = GetSystemMenu(FALSE); LoadAccelTable(MAKEINTRESOURCE(IDR_ACCEL)); color = RGB(255, 0, 0); } ~CMyFrame() { } DECLARE_MESSAGE_MAP() } ;

UPDATE_COMMAND_UI UPDATE_COMMAND_UI 的觀念 MFC 提供了 UPDATE_COMMAND_UI 訊息專司維護視窗元件的狀態。

UPDATE_COMMAND_UI UPDATE_COMMAND_UI 的原理 UPDATE_COMMAND_UI 訊息是一個及時檢查 UI 元件狀態的機制。 當我們按下選單,在選單尚未顯示前,該選單所有選項發出 UPDATE_COMMAND_UI 訊息,程式收到這個訊息時,同時也會收到一個 CCmdUI 物件指標,該物件指標將指向發出 UPDATE_COMMAND_UI 訊息的 UI 物件。 藉由這些發出的訊息,呼叫回應的函數,檢查該 UI 元件應該顯示的狀態。

#include <afxwin.h> #include "resource.h" class CMyFrame : public CFrameWnd { private: CMenu MainMenu, *SysMenu, *PopMenu, *SubMenu; COLORREF color; public: CMyFrame() { Create(NULL, "Menu Resource Demo", WS_OVERLAPPEDWINDOW | WS_VISIBLE, rectDefault, NULL, MAKEINTRESOURCE(IDR_SMENU)); SysMenu = GetSystemMenu(FALSE); LoadAccelTable(MAKEINTRESOURCE(IDR_ACCEL)); color = RGB(255, 0, 0); } ~CMyFrame() { } afx_msg void OnSwitchItem() { CMenu InsMenu; InsMenu.LoadMenu(IDR_INSMENU); MainMenu.LoadMenu(IDR_MAINMENU); MainMenu.AppendMenu(MF_POPUP, (UINT) InsMenu.m_hMenu, "&Color Setting"); SubMenu = MainMenu.GetSubMenu(1); SubMenu->AppendMenu(MF_SEPARATOR); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_STRING, IDM_INSERTITEM, "&Insert Item"); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_POPUP, (UINT) InsMenu.m_hMenu, "Insert &submenu"); //SetCheck(); InsMenu.Detach(); SetMenu(&MainMenu);

afx_msg void OnCreateItem() { MainMenu.ModifyMenu(IDM_CREATEITEM, MF_BYCOMMAND, IDM_DELETEITEM, "&Delete Item"); SubMenu = MainMenu.GetSubMenu(1); SubMenu->AppendMenu(MF_STRING, IDM_NEWITEM, "New Item"); } afx_msg void OnDeleteItem() { MainMenu.ModifyMenu(IDM_DELETEITEM, MF_BYCOMMAND, IDM_CREATEITEM, "&Create Item"); SubMenu->DeleteMenu(IDM_NEWITEM, MF_BYCOMMAND); afx_msg void OnContextMenu(CWnd *pWnd, CPoint point) { CMenu menu; menu.LoadMenu(IDR_POPMENU); PopMenu = menu.GetSubMenu(0); PopMenu->TrackPopupMenu(TPM_CENTERALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); menu.Detach(); afx_msg void OnRed() { //SetUnCheck(); color = RGB(255, 0, 0); //SetCheck(); afx_msg void OnGreen() { color = RGB(0, 255, 0);

afx_msg void OnBlue() { //SetUnCheck(); color = RGB(0, 0, 255); //SetCheck(); } /* void SetCheck() { switch(color) { case RGB(255, 0, 0): MainMenu.CheckMenuItem(IDM_RED, MF_BYCOMMAND | MF_CHECKED); break; case RGB(0, 255, 0): MainMenu.CheckMenuItem(IDM_GREEN, MF_BYCOMMAND | MF_CHECKED); case RGB(0, 0, 255): MainMenu.CheckMenuItem(IDM_BLUE, MF_BYCOMMAND | MF_CHECKED); void SetUnCheck() { MainMenu.CheckMenuItem(IDM_RED, MF_BYCOMMAND | MF_UNCHECKED); MainMenu.CheckMenuItem(IDM_GREEN, MF_BYCOMMAND | MF_UNCHECKED); MainMenu.CheckMenuItem(IDM_BLUE, MF_BYCOMMAND | MF_UNCHECKED); } */

afx_msg void OnUpdateRed(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(255, 0, 0)); } afx_msg void OnUpdateGreen(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(0, 255, 0)); afx_msg void OnUpdateBlue(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(0, 0, 255)); afx_msg void OnLButtonDown(UINT nFlags, CPoint point) { SetCapture(); } afx_msg void OnMouseMove(UINT nFlags, CPoint point) { if(this == GetCapture()) { CClientDC aDC(this); aDC.SetPixel(point, color); afx_msg void OnLButtonUp(UINT nFlags, CPoint point) { ReleaseCapture(); } DECLARE_MESSAGE_MAP() } ;

BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd) ON_COMMAND(IDM_SWITCHITEM, OnSwitchItem) ON_COMMAND(IDM_CREATEITEM, OnCreateItem) ON_COMMAND(IDM_DELETEITEM, OnDeleteItem) ON_COMMAND(IDM_RED, OnRed) ON_COMMAND(IDM_GREEN, OnGreen) ON_COMMAND(IDM_BLUE, OnBlue) ON_UPDATE_COMMAND_UI(IDM_RED, OnUpdateRed) ON_UPDATE_COMMAND_UI(IDM_GREEN, OnUpdateGreen) ON_UPDATE_COMMAND_UI(IDM_BLUE, OnUpdateBlue) ON_WM_CONTEXTMENU() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() END_MESSAGE_MAP() class CMyApp : public CWinApp { public: BOOL InitInstance() { CFrameWnd *Frame = new CMyFrame; m_pMainWnd = Frame; Frame->ShowWindow(SW_SHOW); return true; } } ; CMyApp a_app;

工具列資源 工具列的使用 除了選單之外,在視窗程式裡最常見的視窗元件還有工具列與狀態列。工具列是另一種加速視窗介面操作的工具,對於一些操作視窗時常用的指令,我們都可以將之放在宗坐列中,方便使用者使用。

IDM_RED (Tool Button 'R') IDM_GREEN (Tool Button 'G') IDM_BLUE (Tool Button 'B')

#include <afxwin.h> #include <afxext.h> #include "resource.h" class CMyFrame : public CFrameWnd { private: CMenu MainMenu, *SysMenu, *PopMenu, *SubMenu; CToolBar toolbar; COLORREF color; public: CMyFrame() { Create(NULL, "Menu Resource Demo", WS_OVERLAPPEDWINDOW | WS_VISIBLE, rectDefault, NULL, MAKEINTRESOURCE(IDR_SMENU)); SysMenu = GetSystemMenu(FALSE); LoadAccelTable(MAKEINTRESOURCE(IDR_ACCEL)); color = RGB(255, 0, 0); } ~CMyFrame() { } afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CFrameWnd::OnCreate(lpCreateStruct)) return -1; toolbar.Create(this); toolbar.LoadToolBar(IDR_TOOLBAR); toolbar.EnableDocking(CBRS_ALIGN_TOP); toolbar.SetBarStyle(toolbar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&toolbar); return 0;

afx_msg void OnSwitchItem() { CMenu InsMenu; InsMenu.LoadMenu(IDR_INSMENU); MainMenu.LoadMenu(IDR_MAINMENU); MainMenu.AppendMenu(MF_POPUP, (UINT) InsMenu.m_hMenu, "&Color Setting"); SubMenu = MainMenu.GetSubMenu(1); SubMenu->AppendMenu(MF_SEPARATOR); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_STRING, IDM_INSERTITEM, "&Insert Item"); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_POPUP, (UINT) InsMenu.m_hMenu, "Insert &submenu"); //SetCheck(); InsMenu.Detach(); SetMenu(&MainMenu); } afx_msg void OnCreateItem() { MainMenu.ModifyMenu(IDM_CREATEITEM, MF_BYCOMMAND, IDM_DELETEITEM, "&Delete Item"); SubMenu->AppendMenu(MF_STRING, IDM_NEWITEM, "New Item"); afx_msg void OnDeleteItem() { MainMenu.ModifyMenu(IDM_DELETEITEM, MF_BYCOMMAND, IDM_CREATEITEM, "&Create Item"); SubMenu->DeleteMenu(IDM_NEWITEM, MF_BYCOMMAND);

afx_msg void OnContextMenu(CWnd *pWnd, CPoint point) { CMenu menu; menu.LoadMenu(IDR_POPMENU); PopMenu = menu.GetSubMenu(0); PopMenu->TrackPopupMenu(TPM_CENTERALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); menu.Detach(); } afx_msg void OnRed() { color = RGB(255, 0, 0); afx_msg void OnGreen() { color = RGB(0, 255, 0); afx_msg void OnBlue() { color = RGB(0, 0, 255); afx_msg void OnUpdateRed(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(255, 0, 0)); afx_msg void OnUpdateGreen(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(0, 255, 0)); afx_msg void OnUpdateBlue(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(0, 0, 255));

afx_msg void OnLButtonDown(UINT nFlags, CPoint point) { SetCapture(); } afx_msg void OnMouseMove(UINT nFlags, CPoint point) { if(this == GetCapture()) { CClientDC aDC(this); aDC.SetPixel(point, color); } afx_msg void OnLButtonUp(UINT nFlags, CPoint point) { ReleaseCapture(); } DECLARE_MESSAGE_MAP() } ; BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd) ON_WM_CREATE() ON_COMMAND(IDM_SWITCHITEM, OnSwitchItem) ON_COMMAND(IDM_CREATEITEM, OnCreateItem) ON_COMMAND(IDM_DELETEITEM, OnDeleteItem) ON_COMMAND(IDM_RED, OnRed) ON_COMMAND(IDM_GREEN, OnGreen) ON_COMMAND(IDM_BLUE, OnBlue) ON_UPDATE_COMMAND_UI(IDM_RED, OnUpdateRed) ON_UPDATE_COMMAND_UI(IDM_GREEN, OnUpdateGreen) ON_UPDATE_COMMAND_UI(IDM_BLUE, OnUpdateBlue) ON_WM_CONTEXTMENU() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() END_MESSAGE_MAP()

class CMyApp : public CWinApp { BOOL InitInstance() { CFrameWnd *Frame = new CMyFrame; m_pMainWnd = Frame; Frame->ShowWindow(SW_SHOW); return true; } } ; CMyApp a_app;

狀態列與字串表 狀態列 狀態列用於顯示目前程式的執行狀態與說明,例如顯示目前文字輸入狀態為插入或是覆蓋。此外狀態列亦可以協助使用者操作視窗,例如許多視窗程式,當你欲選取某工作列或選單選項時,將會在狀態列中顯示說明文字。 字串表 字串表的主要用途是以識別子代替某些字串,例如對話盒中顯示的文字。以字串資源代替字串的好處,在於讓程式的更改變得容易。這對於程式的 "國際化" (internationalization; i18n) 與 "本土化" (localization; l10n) 相當有幫助。

#include <afxwin.h> #include <afxext.h> #include "resource.h" class CMyFrame : public CFrameWnd { private: CMenu MainMenu, *SysMenu, *PopMenu, *SubMenu; CToolBar toolbar; CStatusBar statusbar; COLORREF color; public: CMyFrame() { Create(NULL, "Menu Resource Demo", WS_OVERLAPPEDWINDOW | WS_VISIBLE, rectDefault, NULL, MAKEINTRESOURCE(IDR_SMENU)); SysMenu = GetSystemMenu(FALSE); LoadAccelTable(MAKEINTRESOURCE(IDR_ACCEL)); color = RGB(255, 0, 0); } ~CMyFrame() { } afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CFrameWnd::OnCreate(lpCreateStruct)) return -1; toolbar.Create(this); toolbar.LoadToolBar(IDR_TOOLBAR); toolbar.EnableDocking(CBRS_ALIGN_TOP); toolbar.SetBarStyle(toolbar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&toolbar); static UINT indicators[] = { ID_SEPARATOR, IDS_RED } ; statusbar.Create(this); statusbar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT)); statusbar.SetPaneStyle(1, SBPS_POPOUT); return 0;

afx_msg void OnSwitchItem() { CMenu InsMenu; InsMenu.LoadMenu(IDR_INSMENU); MainMenu.LoadMenu(IDR_MAINMENU); MainMenu.AppendMenu(MF_POPUP, (UINT) InsMenu.m_hMenu, "&Color Setting"); SubMenu = MainMenu.GetSubMenu(1); SubMenu->AppendMenu(MF_SEPARATOR); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_STRING, IDM_INSERTITEM, "&Insert Item"); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_POPUP, (UINT) InsMenu.m_hMenu, "Insert &submenu"); //SetCheck(); InsMenu.Detach(); SetMenu(&MainMenu); } afx_msg void OnCreateItem() { MainMenu.ModifyMenu(IDM_CREATEITEM, MF_BYCOMMAND, IDM_DELETEITEM, "&Delete Item"); SubMenu->AppendMenu(MF_STRING, IDM_NEWITEM, "New Item"); afx_msg void OnDeleteItem() { MainMenu.ModifyMenu(IDM_DELETEITEM, MF_BYCOMMAND, IDM_CREATEITEM, "&Create Item"); SubMenu->DeleteMenu(IDM_NEWITEM, MF_BYCOMMAND);

afx_msg void OnContextMenu(CWnd *pWnd, CPoint point) { CMenu menu; menu.LoadMenu(IDR_POPMENU); PopMenu = menu.GetSubMenu(0); PopMenu->TrackPopupMenu(TPM_CENTERALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); menu.Detach(); } afx_msg void OnRed() { CString resstr; color = RGB(255, 0, 0); resstr.LoadString(IDS_RED); statusbar.SetPaneText(1, resstr.GetBuffer(80)); afx_msg void OnGreen() { color = RGB(0, 255, 0); resstr.LoadString(IDS_GREEN); afx_msg void OnBlue() { color = RGB(0, 0, 255); resstr.LoadString(IDS_BLUE); afx_msg void OnUpdateRed(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(255, 0, 0));

afx_msg void OnUpdateGreen(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(0, 255, 0)); } afx_msg void OnUpdateBlue(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(0, 0, 255)); afx_msg void OnLButtonDown(UINT nFlags, CPoint point) { SetCapture(); } afx_msg void OnMouseMove(UINT nFlags, CPoint point) { if(this == GetCapture()) { CClientDC aDC(this); aDC.SetPixel(point, color); afx_msg void OnLButtonUp(UINT nFlags, CPoint point) { ReleaseCapture(); } DECLARE_MESSAGE_MAP() } ;

BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd) ON_WM_CREATE() ON_COMMAND(IDM_SWITCHITEM, OnSwitchItem) ON_COMMAND(IDM_CREATEITEM, OnCreateItem) ON_COMMAND(IDM_DELETEITEM, OnDeleteItem) ON_COMMAND(IDM_RED, OnRed) ON_COMMAND(IDM_GREEN, OnGreen) ON_COMMAND(IDM_BLUE, OnBlue) ON_UPDATE_COMMAND_UI(IDM_RED, OnUpdateRed) ON_UPDATE_COMMAND_UI(IDM_GREEN, OnUpdateGreen) ON_UPDATE_COMMAND_UI(IDM_BLUE, OnUpdateBlue) ON_WM_CONTEXTMENU() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() END_MESSAGE_MAP() class CMyApp : public CWinApp { public: BOOL InitInstance() { CFrameWnd *Frame = new CMyFrame; m_pMainWnd = Frame; Frame->ShowWindow(SW_SHOW); return true; } } ; CMyApp a_app;

點陣圖、圖示、游標 點陣圖的用途 圖示的用途 游標資源 為了建立更華麗的視窗介面,圖檔亦被使用於建立視窗介面。 在視窗程式的左上角,通常有一個圖示 (icon) 。當我們將視窗縮到最小時,應用程式將以這個圖示代表。 游標資源 當操作應用程式時,滑鼠的游標會隨著執行的狀態有所不同。在 MFC 裡,亦提供了滑鼠游標資源,用於建立自訂滑鼠游標。

#include <afxwin.h> #include <afxext.h> #include "resource.h" class CMyFrame : public CFrameWnd { private: CMenu MainMenu, *SysMenu, *PopMenu, *SubMenu; CToolBar toolbar; CStatusBar statusbar; COLORREF color; HCURSOR hcursor; CBitmap bmp; public: CMyFrame() { CMenu *Menu; Create(NULL, "Menu Resource Demo", WS_OVERLAPPEDWINDOW | WS_VISIBLE, rectDefault, NULL, MAKEINTRESOURCE(IDR_SMENU)); SysMenu = GetSystemMenu(FALSE); LoadAccelTable(MAKEINTRESOURCE(IDR_ACCEL)); color = RGB(255, 0, 0); bmp.LoadBitmap(IDB_BITMAP); Menu = GetMenu()->GetSubMenu(0); Menu->AppendMenu(MF_BITMAP, IDM_BMPITEM, &bmp); } ~CMyFrame() { } afx_msg void OnBmpItem() { MessageBox("Bitmap item selected.", "Message Box");

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CFrameWnd::OnCreate(lpCreateStruct)) return -1; toolbar.Create(this); toolbar.LoadToolBar(IDR_TOOLBAR); toolbar.EnableDocking(CBRS_ALIGN_TOP); toolbar.SetBarStyle(toolbar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&toolbar); static UINT indicators[] = { ID_SEPARATOR, IDS_RED } ; statusbar.Create(this); statusbar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT)); statusbar.SetPaneStyle(1, SBPS_POPOUT); return 0; } afx_msg void OnSwitchItem() { CMenu InsMenu; InsMenu.LoadMenu(IDR_INSMENU); MainMenu.LoadMenu(IDR_MAINMENU); MainMenu.AppendMenu(MF_POPUP, (UINT) InsMenu.m_hMenu, "&Color Setting"); SubMenu = MainMenu.GetSubMenu(1); SubMenu->AppendMenu(MF_SEPARATOR); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_STRING, IDM_INSERTITEM, "&Insert Item"); SubMenu->InsertMenu(IDM_CREATEITEM, MF_BYCOMMAND | MF_POPUP, (UINT) InsMenu.m_hMenu, "Insert &submenu"); //SetCheck(); InsMenu.Detach(); SetMenu(&MainMenu);

afx_msg void OnCreateItem() { MainMenu.ModifyMenu(IDM_CREATEITEM, MF_BYCOMMAND, IDM_DELETEITEM, "&Delete Item"); SubMenu = MainMenu.GetSubMenu(1); SubMenu->AppendMenu(MF_STRING, IDM_NEWITEM, "New Item"); } afx_msg void OnDeleteItem() { MainMenu.ModifyMenu(IDM_DELETEITEM, MF_BYCOMMAND, IDM_CREATEITEM, "&Create Item"); SubMenu->DeleteMenu(IDM_NEWITEM, MF_BYCOMMAND); afx_msg void OnContextMenu(CWnd *pWnd, CPoint point) { CMenu menu; menu.LoadMenu(IDR_POPMENU); PopMenu = menu.GetSubMenu(0); PopMenu->TrackPopupMenu(TPM_CENTERALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); menu.Detach(); afx_msg void OnRed() { CString resstr; color = RGB(255, 0, 0); resstr.LoadString(IDS_RED); statusbar.SetPaneText(1, resstr.GetBuffer(80)); afx_msg void OnGreen() { color = RGB(0, 255, 0); resstr.LoadString(IDS_GREEN);

afx_msg void OnBlue() { CString resstr; color = RGB(0, 0, 255); resstr.LoadString(IDS_BLUE); statusbar.SetPaneText(1, resstr.GetBuffer(80)); } afx_msg void OnUpdateRed(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(255, 0, 0)); afx_msg void OnUpdateGreen(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(0, 255, 0)); afx_msg void OnUpdateBlue(CCmdUI *aCmdUI) { aCmdUI->SetCheck(color == RGB(0, 0, 255)); afx_msg void OnLButtonDown(UINT nFlags, CPoint point) { hcursor = AfxGetApp()->LoadCursor(IDC_CURSOR); ::SetCursor(hcursor); SetCapture(); afx_msg void OnMouseMove(UINT nFlags, CPoint point) { if(this == GetCapture()) { CClientDC aDC(this); aDC.SetPixel(point, color); afx_msg void OnLButtonUp(UINT nFlags, CPoint point) { ReleaseCapture(); }

DECLARE_MESSAGE_MAP() } ; BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd) ON_WM_CREATE() ON_COMMAND(IDM_SWITCHITEM, OnSwitchItem) ON_COMMAND(IDM_CREATEITEM, OnCreateItem) ON_COMMAND(IDM_DELETEITEM, OnDeleteItem) ON_COMMAND(IDM_RED, OnRed) ON_COMMAND(IDM_GREEN, OnGreen) ON_COMMAND(IDM_BLUE, OnBlue) ON_COMMAND(IDM_BMPITEM, OnBmpItem) ON_UPDATE_COMMAND_UI(IDM_RED, OnUpdateRed) ON_UPDATE_COMMAND_UI(IDM_GREEN, OnUpdateGreen) ON_UPDATE_COMMAND_UI(IDM_BLUE, OnUpdateBlue) ON_WM_CONTEXTMENU() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() END_MESSAGE_MAP() class CMyApp : public CWinApp { public: BOOL InitInstance() { CFrameWnd *Frame = new CMyFrame; m_pMainWnd = Frame; Frame->SetIcon(LoadIcon(IDI_ICON), TRUE); Frame->ShowWindow(SW_SHOW); return true; } CMyApp a_app;