天天看點

MFC小結

microsoft  基礎類庫

                             vc愛好者

mfc 的文檔包括對類的引用,全局函數,全局變量和宏組成該庫,再加上由mfc開發團隊收集書面的技術說明.

 mfc reference (mfc 參考)

 mfc technical notes (mfc 技術說明)

 mfc sample programs (mfc 示例程式)

 hierarchy chart (層次結構圖)

 hierarchy chart categories (類層次結構圖)

 about the mfc classes (關于mfc類)

有趣的首頁:

 visual c++ home (visual c++ 首頁)

 adding user-interface features (添加使用者界面功能)

 adding program functionality (添加程式功能)

 active template library (atl) (活動模闆庫(atl))

 ole db templates (ole db 模闆)

可視對象類:

 1視窗類:cwnd類

   cwnd提供了mfc中所有視窗類的基本功能,是ccmdtarget類的子類

   建立windows視窗要分兩步進行(1引入構造函數,構造一個cwnd對象2調用create建立視窗并将它連接配接到cwnd對象上)

 2視類:cview類

  該類表示架構視窗的客戶區和顯示文檔資料并接受輸入的客戶區其派生類主要有如下幾種:

   cscrollview :具有滾動功能的視的基類

   cformview:其布局再對話資源中定義的滾動

   ceditview:具有文本編輯、查找、替換和滾動功能的視

 3菜單類:cmenu類

  該類是cobject類的子類,用于管理菜單,它是一個windows hmenu的封裝,提供了與視窗有關的菜單資源建立、修改、跟蹤及删除的成員函數。

 4對話框類:cdialog類

   由于對話框是一個特殊的視窗,是以該類是從cwnd類中派生出來的。對話框子層次結構包括通用對話框類cdialog以及支援檔案選擇、顔色選擇、字型選擇、列印、替換文本的公共對話框子類。

 5控件類

 控件子層次結構包括若幹類,使用這些類可以建立靜态文本、指令按鈕、位圖按鈕、清單框、組合框、滾動條、編輯框等。這些直覺控件為windows應用程式提供了各種輸入和顯示界面。

 6控件條類:ccontrolbar類

  控件條子層次結構為工具條、狀态條、對話條和分割視窗建立模型。該類是ctoolbar、cstatusbar、cdialogbar的基類,負責管理工具條、狀态條、對話條的一些成員函數。控件條指的是連接配接在主視窗架構的頂部或底部的小視窗。

 7繪畫對象類:cgdiobject類

  圖形繪畫對象子層次結構以cgdiobject類為跟類,可用于建立繪畫對象模型,如畫筆、刷子、字型、位圖、調色闆等。

 8裝置描述表類:cdc類

  該類及其子類支援裝置描述表對象,是cobject類的子類。cdc類是一個較大的類,包括許多成員函數,如映射函數、繪畫工具函數、區域函數等,通過cdc對象的成員函數可以完成所有的繪圖工作。

 通用類

 此類提供了許多通用服務,例如檔案i/o 、診斷和異常處理等。此外還包括如數組和清單等存放資料集的類

 1.檔案類: cfile 和 carchive類用以編寫輸入輸出處理函數

 2.異常類:cexception類是所有異常情況的基類不能直接建立cexception對象,隻能建立派生類的對象,用派生類來捕獲指定的異常情況。

 3.模闆收集類 這些類可以将多種對象存放到數組、清單和“映射”中但這些收集類是模闆,它們的參數确定了存放集合中的對象類型。

ole類

 對象連接配接與嵌入子層次結構為支援ole提供了9個類

 普通類 coledocuemnt 、coleitem、coleexception

 客戶類 coleclientdoc 、coleclientitem

 伺服器類 coleserver、coletemplate、coserverdoc、coserveritem

odbc資料庫類

 開放資料庫連接配接連接配接子層次結構提供了一些類來支援odbc特征,即開通過這些類可開發資料庫應用程式來通路多個資料庫檔案。

mfc中全局函數與全局變量

以afx開頭的函數除資料庫類函數和ddx(dialog data exchange)函數外,在目前的版本中,都表示是一個全局函數。以afx為字首的變量都是全局變量。

 函數                 功能

afxabort                 無條件終止一個應用程式

afxbeginthread           建立一個新程序并執行他

afxendthread             終止目前正在執行的程序

afxformatstring          格式化字元串

afxmessagebox            顯示一個windows消息框

afxgetapp                傳回目前應用程式對象的指針

afxgetinstancehandle     傳回辨別目前對應程式對象的句柄

afxregisterwndclass      登記用于建立windows視窗的視窗類

=====================================================================================================================

制作含編輯框的應用程式

編輯框在windows風格的應用程式中是随處可見的 ,當需要獲得來自使用者的文本資訊,或者要讓使用者輸入或編輯文本時,應該使用編輯控件。

編輯框控件簡介

  編輯框控件具有許多功能,windows中的記事本(notepad)應用程式就是一個帶有控件菜單的編輯框控件

  編輯框控件(單行編輯框控件,多行編輯框控件)

cedit 的層次結構

  +-cobject

    +-ccmdtarget

     +-cwnd

      +-cedit

 編輯框控件類cedit的結構很複雜,當建立cedit對象時,mfc自動賦予該對象一個标準的windows編輯控件它定義了cedit對象。

 cedit所在的頭檔案 afxwin.h

  1.class cedit::public cwnd

  2.{declare_dynamic(cedit)

  //定義構造函數

  3.public;

  4.cedit();

  5.bool create(dword) dwstyle,const rect&rect, cwnd*pparentwnd,uint nid);

//成員函數

  6.bool canundo() const;

  7.int getlinecount() const;

  8.bool getmodify() const;

  9.void setmodify(bool bmodified=true);

  10.void getrect(lprect iprect) const;

  11.dword getsel() const;

  12.void getsel(int& nstartchar,int& nendchar) const;

  13.hlocal gethandle() const;

  14.void sethandle(hlocal hbuffer);

 //剪貼闆操作

  bool undo();

  void clear();

  void copy();

  void cut();

  void paste();

  bool setreadonly(bool breadonly = true);

  int getfirstvisibleline() const;

  tchar getpasswordchar() const;

 //implementation

 public: virtual ~cedit(); //虛拟析構函數

};

通用cedit類的方法

方法     說明

canundo()    決定一個編輯操作是否可以撤銷

clear()     從編輯控件中删除目前的選擇(如果有的話)

copy()                    将編輯控件目前的選擇(如果有的話)以cf_text格式指派到剪切闆中

cut()     剪下編輯控件中的目前選擇(如果有的話)并以cf_text 格式複制到剪切闆中

emptyundobuffer()   消除一個編輯控件的“撤銷”标志

getfirstvisibleline()     确定編輯控件中的最上面的可視行

getmodify()               确定一個編輯控件的内容是否可修改

getpasswordchar()         目前使用者輸入文本是,獲得編輯控件中顯示的密碼字元

getrect()                 獲得一個編輯控件的格式化矩形

getsel()                  獲得編輯控件中目前選擇的開始和結束字元位置

limittext()               限定使用者可能輸入一編輯控件的文本長度

linefromchar()            獲得包含指定字元下标的行的行号

linelength()              獲得編輯控件中的一行的長度

linescroll()              滾動多行編輯控件的文本

paste()                   将剪貼闆的資料插入到編輯控件作目前的光标位置,隻有目前剪切闆中資料格式為ce_text是方可插入

replacesel()              用指定文本替代編輯控件中目前選擇的部分

setmodify()    設定或清除編輯控件的修改标志

setpasswordchar()         當使用者輸入文本時設定或删除一個顯示與編輯控件中的密碼字元

setreadonly()    将編輯控件設定為隻讀狀态

setsel()                  再編輯控件中選擇字元的範圍

undo()                    取消最後一個編輯控件操作

多行編輯所支援的cedit法

方法   說明

fmtlines()              設定在多行編輯控件中包含軟體分行符

gethandle()   獲得目前配置設定給一個多行編輯控件的記憶體的句柄

getline()  從一編輯控件中獲得一行文本

getlinecount()  獲得多行編輯控件的行數

lineindex()  設定多行編輯控件愛你中一行的字元下标

sethandle()  設定多行編輯控件将要用到的句柄記憶體句柄

setrect()  設定多行編輯控件的格式化矩形并更新控件

setrectnp()  設定多行編輯控件的格式化矩形并且不重繪控件視窗

settabstops()  在多行編輯控件中設定制表位(tab)

//這是顯示第一個edit的内容的點選事件

void cnoteeditdlg::onshow1() 

 //設定編輯框一中的所有内容

 m_editone.setsel(0,-1);

 //替換内容為"this is a first edit1!"

 m_editone.replacesel("this is a first editbox!");

}

//清楚編輯框中内容的單擊事件

void cnoteeditdlg::onclear1() 

{

 //設定選中編輯框中的所有内容

 //替換編輯框中的内容為空

 m_editone.replacesel("");

//顯示編輯框2中内容的單擊事件

void cnoteeditdlg::onshow2() 

 //選中所有的内容

 m_edittwo.setsel(0,-1);

 //然後替換為以下内容

 m_edittwo.replacesel("this is a two editbox");

//清空編輯文本框2中的所有内容按鈕的單擊事件

void cnoteeditdlg::onclear2() 

 //選中所有内容

   m_edittwo.setsel(0,-1);

   //替換内容為空

   m_edittwo.replacesel("");

//退出函數

void cnoteeditdlg::onexit() 

  //退出

  onok();

//ontransfer按鈕的單擊事件

void cnoteeditdlg::ontransfer() 

 //選中文本框1中的内容

 //複制文本框一中的内容

 m_editone.copy();

 //選中文本框中2的内容

 //替換文本框2中内容

 m_edittwo.replacesel("");

 //文本框二響應張貼事件

 m_edittwo.paste();

//undo按鈕的單擊事件

void cnoteeditdlg::onundo() 

 //取消對editone文本框的上一步操作

  m_editone.undo();

 //徐曉對edittwo文本框的上一步操作

 m_edittwo.undo();

//單文本框獲得焦點的事件

void cmaileditboxdlg::onsetfocussinglebox() 

 //設定變量ifmultilineeditfocus為false

 ifmultilineeditfocus =false;

 //設定變量ifsingleeditfocus=true

 ifsingleeditfocus=true;

//富文本框中文本資訊發生變化的時候觸發的事件

void cmaileditboxdlg::onchangemuilbox() 

 //定義一個字元串

 cstring metext;

 //定義一個字元創數組

 char count[6];

 //定義兩個整型變量,ncharnum,nlinenum分别用來接收字元數和行數

 int ncharnum,nlinenum;

 //獲得富文本框中的所有值

 m_muilbox.getwindowtext(metext);

 //獲得總的行數

 nlinenum=m_muilbox.getlinecount();

 //獲得檔案的長度

 ncharnum = metext.getlength();

 //字元串的長度等于總的字元長度減去字元串中的換行符

 ncharnum -= (nlinenum-1);

 //轉換資料

 itoa(ncharnum,count,10);

 //設定文本

 m_charnum.setwindowtext(count);

 //轉化資料

 itoa(nlinenum,count,10);

 m_linecount.setwindowtext(count);

//富文本框獲得焦點的時候觸發的事件

void cmaileditboxdlg::onsetfocusmuilbox() 

 //設定變量ifmultilineeditfocus為真

    ifmultilineeditfocus =true;

 //設定變量ifsingleeditfocus為假

 ifsingleeditfocus=false; 

//剪切按鈕的單擊事件

void cmaileditboxdlg::oncut() 

  //判斷如果富文本框中獲得焦點

  if(ifmultilineeditfocus) 

   //剪切富文本框中的所有資訊

   m_muilbox.cut();

      //判斷如果單選框中獲得焦點

   else if(ifsingleeditfocus)

      //剪切單文本框中的所有資訊

   m_singlebox.cut();

 else;

//複制按鈕的單擊事件

void cmaileditboxdlg::oncopy() 

 //判斷如果富文本框獲得焦點

 if(ifmultilineeditfocus)

  //複制富文本框中的所有文字

  m_muilbox.copy();

 //如果單文本框獲得焦點

 else if(ifsingleeditfocus)

  //複制單文本框中的所有文字

  m_singlebox.copy();

//粘貼按鈕的單擊事件

void cmaileditboxdlg::onpaste() 

  //把粘貼闆中的資訊粘貼到富文本框

  m_muilbox.paste();

    else if(ifsingleeditfocus)

  //把粘貼闆中的資訊粘貼到單文本框中

  m_singlebox.paste();

//撤銷按鈕的單擊事件

void cmaileditboxdlg::onundo() 

 //判斷如果富文本框獲得焦點并且可以撤銷

 if(ifmultilineeditfocus && m_muilbox.canundo())

   //撤銷富文本框中的上一個操作

   m_muilbox.undo();

 //如果單文本框獲得焦點并且可以撤銷

    else if(ifsingleeditfocus && m_singlebox.canundo())

   //撤銷單文本框的上一個操作

   m_singlebox.undo();

//關閉窗體的單擊事件

void cmaileditboxdlg::onclose() 

  //關閉窗體

  onok(); 

菜單設計

使用者與應用程式的互動通常是從菜單欄中選擇指令或用鍵盤加速鍵的方式,是以菜單和加速鍵的資源再vc++程式設計中是很重要的。

菜單的簡介

 菜單一般存放在資源腳本中,再程式運作時才調用,一個菜單項一般有兩個必要的部分,他們分别是字元串名如file和整數辨別符,一般來說,菜單的辨別符id再資源的頭檔案(resource.h)中定義,如:

#define idm_menu1 129

  其中,字首idm指明是菜單項,在菜單資源建立後,必須将它連接配接到類中,通過提供類方法來處理每個菜單項。

菜單結構

 菜單模闆用一種很簡單的結構再資源腳本檔案中定義下面就是一個菜單資源模闆

 idm_menu1 menu discaedable

 begin

  popup "&file"   //菜單名稱

  begin

    menuitem "&voice", idc_voice_menu //菜單項

    menuitem "&show", idc_show_menu //菜單項

    menuitem separator               //分割線

    menuitem "&exit", idc_exit_menu  //菜單項

  end           //菜單file結束

  popup "&help"   //定義helper菜單

    menuitem "&about",  idc_about_menu //菜單項

  end  //菜單help定義結束

 end

cmenu 類

 +-cobject

  +-cmenu

cmenu類提供了許多處理菜單和菜單項的方法,他們分别是構造方法、菜單操作方法、菜單項操作方法和虛拟方法。構造方法是用來建立windows菜單并在運作時将它們附加到cmenu對象上。

cmenu的構造方法

attach()                把一個标準的windows菜單句柄附加到cmenu對象上

createmenu()  建立一個空菜單并把它附加到cmenu對象上

createpopupmenu() 建立一個彈出式菜單并把他附加到cmenu對象上

deletetempmap()  删除由fromhandle()構造函數建立的任何臨時cmenu對象

desroymenu()  去掉附加到cmenu對象上的菜單并釋放該菜單占有的任何記憶體

deatch()  cmenu對象上拆開windows菜單句柄并傳回該句柄

fromhandle()  當給定windows菜單句柄時,傳回cmenu對象指針

getsafehmenu()  傳回由cmenu對象封裝的菜單句柄成員(m_hmenu)

loadmenu()  從可執行檔案裝入菜單資源并把它附加到cmenu對象上

loadmenuindirect()      從記憶體中的菜單模闆中裝入菜單并把它附加到cmenu對象上

菜單操作方法中隻有兩個類方法用來處理菜單的頂層操作

 deltemenu() 删除某個特定的菜單項(包括附屬的級聯菜單項)

 trackpopupmenu()在一個point結構索指定的位置顯示一個快捷菜單

菜單項特定操作的cmenu類的方法

方法      說明

appendmenu()                    把一個新項加到給定的菜單的末端

checkmenuitem()   在彈出式菜單中,把一個校驗标記放到下一個菜單項或從一個菜單中取消一個已存在的單選按鈕

checkmenuradioitem()  再此組中,把一個單選按鈕反倒菜單項旁邊或從全部其他菜單項裡取消一個已存在的單選按鈕

enablemenuitem()  去掉(添加)一個菜單項

getmenucontexthelpid()  檢索與菜單結合的幫助上下文id

getmenuitemcount()  在彈出式或頂層菜單中獲得項成員

getmenuitemid()   為設定在指定位置的菜單項獲得菜單項辨別符

getmenustate()   獲得指定菜單項的狀态或彈出式菜單中的菜單項成員

getmenustring()   獲得指定菜單項的标記

getsubmenu()   獲得指向彈出式菜單的指針

insertmenu()   在指定位置插入心的菜單項,把其他向向下移

modifymenu()   在指定位置改變已存在的菜單項

removemenu()   從指定菜單删除與彈出式菜單結合的菜單項

setmenucontexthelpid()  設定與菜單有關的版主上下文id

setmenuitembitmaps()  與菜單項有關的指定校驗标記位圖

********************************************************************

// implementation

protected:

 hicon m_hicon;

 // generated message map functions

 //{{afx_msg(cmenuofdilogdlg)

 virtual bool oninitdialog();

 afx_msg void onsyscommand(uint nid, lparam lparam);

 afx_msg void onpaint();

 afx_msg hcursor onquerydragicon();

 afx_msg void onbutton1();

 afx_msg void onclose();

 afx_msg void onsum();

 afx_msg void onaverage();

 //}}afx_msg

 declare_message_map();

private:

 bool ballow;

begin_message_map(cmenuofdilogdlg, cdialog)

 //{{afx_msg_map(cmenuofdilogdlg)

 on_wm_syscommand()

 on_wm_paint()

 on_wm_querydragicon()

 on_bn_clicked(idc_button1, onbutton1)

 on_command(idc_close, onclose)

 on_command(idm_sum,onsum)

 on_command(idm_average,onaverage)

 //}}afx_msg_map

end_message_map()

*******************************************************************

resource.h //配置

#define idm_sum        3265

#define idm_average        3266

void cmenuofdilogdlg::onaverage()

{}

void cmenuofdilogdlg::onsum()

//允許計算的按鈕的單擊事件

void cmenuofdilogdlg::onbutton1() 

 //ballow為假

 if(!ballow)

 {

  //獲得菜單

  cmenu *pmenu=getmenu();

  //獲得菜單欄中的第一個父節點

  cmenu *psubmenu=pmenu->getsubmenu(0);

  //在第一個父節點中添加一個子節點“求和”

  psubmenu->insertmenu(0,mf_byposition,idm_sum,"求和");

  //在第一個父節點中添加一個子節點“求平均值”

  psubmenu->insertmenu(1,mf_byposition,idm_average,"求平均值");

  //設定布爾變量ballow變量為真

  ballow=true;

  //設定按鈕上的文字為禁止計算

  m_allow.setwindowtext("禁止計算");

 }

 else

  cmenu *psubmenu=getmenu()->getsubmenu(0);

  //删除父節點id為idm_sum的節點

  psubmenu->deletemenu(idm_sum,mf_bycommand);

  //删除父節點中子節點id為idm_average的節點

  psubmenu->deletemenu(idm_average,mf_bycommand);

  //設定布爾變量ballow變量為假

  ballow=false;

  m_allow.setwindowtext("允許計算");

//關閉按鈕的單擊事件

void cmenuofdilogdlg::onclose() 

 //關閉窗體

 onok(); 

//求和菜單的點選事件

 //定義一個sum變量

 double sum=0;

 //定義一個字元數組用來進行資料類型轉化

 char strofnum[10];

 //獲得第一個文本框中的值

 m_num1.getwindowtext(strofnum,10);

 //求和把值相加到sum

 sum =sum+atof(strofnum);

 //獲得第二個文本框的值

 m_num2.getwindowtext(strofnum,10);

 //獲得第三個文本框中的值

 m_num3.getwindowtext(strofnum,10);

 //獲得第四個文本框中的值

 m_num4.getwindowtext(strofnum,10);

 //求和把值相加到sum中

 //将字元串裝換格式用strofnum接收

 sprintf(strofnum,"%.3f",sum);

 //設定求和文本框的資訊

 m_sum.setwindowtext(strofnum);

//求平均值的單擊事件

 //定義一個sum接受和

 //定義一個average變量用來計算平均值

 double average;

 //定義一個字元串用來進行資料轉化

 //累加到sum中

 //獲得第二個文本框中的值

 //累加到sum

 //求平均值

 average = sum/4;

 //裝換average變量的格式用strofnum接收

 sprintf(strofnum,"%.3f",average);

 //設定平均值文本框的值

 m_avg.setwindowtext(strofnum);

//退出

void capplicationdlg::onexit() 

 //退出窗體

//菜單中的退出項的指令方法

void capplicationdlg::onexitmenu() 

 onok();

//voice的單擊事件

void capplicationdlg::onvoicemenu() 

 //調用蜂鳴器鳴叫的方法

 messagebeep((word)-1);

 //獲得目前時間

 dword itime= getcurrenttime();

 //循環去調用蜂鳴方法

 while(getcurrenttime()<(itime+10))

  //調用蜂鳴方法

  messagebeep((word)-1);

//顯示消息的指令函數

void capplicationdlg::onshowmenu() 

 //彈出消息

 messagebox("this is a simple exeam!"); 

//按鈕show的單擊事件

void capplicationdlg::onshow() 

 //調用菜單中的onshowmenu函數

  onshowmenu();

void capplicationdlg::onvoice() 

 //調用菜單項vioce的函數

 onvoicemenu();

///////////////////////////////////////////////////////////////

制作含滾動條的應用程式

滾動條是一個互動式、高度可視化的控件,它包括一個滑塊、滾動條的兩端的按鈕等。

滾動條控件與輸入視窗的滾動條是不一樣的

滾動條控件

滾動條控件是由使用者建立管理和釋放的

輸入視窗的滾動條

處于視窗的滾動條是由該視窗建立、管理和釋放的

作為任何一個視窗的子控件,滾動條可以通過通知代碼來建立,但也可以用對話框資源闆來建立

  +-ccmdtarget

   +-cwnd

    +-cscrollbar

cscrollbar 類的方法

方法   說明

enablescrollbar() 是滾動條的一個或兩個箭頭有效或無效

getscrollinfo()  獲得滾動條的資訊

getscrolllimit() 獲得滾動條的範圍

getscrollpos()  獲得滾動條目前的位置

getscrollrange() 獲得滾動條的目前最大的和最小滾動位置

setscrollinfo()  設定滾動條的消息

setscrollpos()  設定滾動條目前的位置

setscrollrange() 設定滾動條的最大和最小滾動位置

showscrollbar()  顯示或隐藏滾動條

建立與初始化滾動條類

建立cscrollbar對象的一般步驟

1.用c++關鍵字new和構造函數cscrollbar::cscrollbar()為一個scrollbar對象配置設定一個執行個體

配置設定一個滾動條控件對象并傳回指向該對象的指針

cscrollbar::pmyscroll = new cscrollbar

2.初始化cscrollbar對象,将一個windows滾動條賦予它,并用cscrollbar::create()方法設定參數和樣式。

調用cscrollbar::create()方法初始化指針

bool create(dword dwstyle,const rect& rect,cwnd *pparentwnd,uint nid);

dword dwstyle 滾動條視窗的樣式

const rect& rect表示控件的大小和位置

cwnd *pparentwnd指向控件所屬視窗的指針

uint nid父視窗與滾動條通信的辨別

在設定滾動條控件時,要通過cscrollbar::setscrollrange()設定範圍

例如設定滾動範圍為-100到100的垂直滾動條

pmyscroll->setscrollrange(sb_vert,-100,100);

在設定了範圍後,還要通過setscrollpos()設定滾動塊目前的位置

例如,滾動塊的位置再-100到100的中間,即為0的位置

pmyscroller->setscrollpos(0);

*****************************************************************************************

bool capplicationofscrollbardlg::oninitdialog()

 cdialog::oninitdialog();

 // add "about..." menu item to system menu.

 // idm_aboutbox must be in the system command range.

 assert((idm_aboutbox & 0xfff0) == idm_aboutbox);

 assert(idm_aboutbox < 0xf000);

 cmenu* psysmenu = getsystemmenu(false);

 if (psysmenu != null)

  cstring straboutmenu;

  straboutmenu.loadstring(ids_aboutbox);

  if (!straboutmenu.isempty())

  {

   psysmenu->appendmenu(mf_separator);

   psysmenu->appendmenu(mf_string, idm_aboutbox, straboutmenu);

  }

 // set the icon for this dialog.  the framework does this automatically

 //  when the application's main window is not a dialog

 seticon(m_hicon, true);   // set big icon

 seticon(m_hicon, false);  // set small icon

 // todo: add extra initialization here

 m_scroll.setscrollrange(0,20);

 m_scroll.setscrollpos(10);

 char spos[10];

 itoa(m_scroll.getscrollpos(),spos,10);

 m_edit.setsel(0,-1);

 m_edit.replacesel(spos);

 updatedata(false);

 return true;  // return true  unless you set the focus to a control

********************************************************************************************

void capplicationofscrollbardlg::onvscroll(uint nsbcode, uint npos, cscrollbar* pscrollbar) 

 int inowpos;

 switch(nsbcode)

  if(pscrollbar==&m_scroll)

   //sb_thumbtrack             滾動條滑塊被拖動   

   //sb_thumbpostion         拖動後滾動條滑塊被釋放   

   case sb_thumbtrack:

    //獲得滾動塊所在的位置

    m_scroll.setscrollpos(npos);

    //轉化成數字

    itoa(npos,spos,10);

    //選中編輯框中的所有文字

    m_edit.setsel(0,-1);

    //替換成目前位置的值

    m_edit.replacesel(spos);

    break;

   //sb_linedown 向下的小三角形

   case sb_linedown:

    //獲得滾動條所在的位置

    inowpos = m_scroll.getscrollpos();

    //滾動條的位置加一

    inowpos=inowpos+1;

    //判斷滾動條的位置不能大于20

    if(inowpos>20)

    {

     //強行吧inowpos的值賦為20

     inowpos=20;

    }

    //設定滾動塊所在的位置

    m_scroll.setscrollpos(inowpos);

    //資料類型轉化

    itoa(m_scroll.getscrollpos(),spos,10);

    //選擇編輯框中的所有的内容

    //重新設定内容

    //sb_lineup 向上的小三角形

   case sb_lineup:

    //獲得滾動塊的位置

     inowpos = m_scroll.getscrollpos();

     //滾動塊的位置減一

    inowpos=inowpos-1;

    //判斷位置不能小于0

    if(inowpos<0)

     //強行指派為0

     inowpos=0;

    //設定滾動塊的位置為inowpos

    //資料轉化

    //選中編輯框中所有的内容

    //替換文本的内容為滾動塊目前所在的位置

   //sb_pagedown  單擊中心點以下的滾動條

   case sb_pagedown:

    //獲得滾動塊目前所在的位置

    //位置加3

    inowpos=inowpos+3;

    //判斷位置不能大于20

     //強行指派為20

    //設定滾動塊現在所在的位置

    //選中文本框中的所有的資料

    //替換文本框中的值為目前滾動塊所在的位置

   //sb_pageup 單擊中心點以上的滾動條

   case sb_pageup:

    //滾動塊的位置減1

    inowpos=inowpos-3;

    //判斷滾動塊的位置不能小于0

    //選中編輯框中的所有的文本

    //替換文本

 cdialog::onvscroll(nsbcode, npos, pscrollbar);

void capplicationofscrollbardlg::onexit() 

 //關閉視窗

void capplicationofscrollbardlg::onreset() 

 //設定滾動塊所在的位置

 m_scroll.setscrollpos(10); 

 //獲得文本框中所有的文本

 //設定文本為“10”

 m_edit.replacesel("10");

void capplicationofscrollbardlg::onup() 

 //設定滾動塊的位置為"0"

 m_scroll.setscrollpos(0);

 //獲得文本框中的所有的文本

 //設定文本框的值為“0”

 m_edit.replacesel("0");

void capplicationofscrollbardlg::ondown() 

 //設定滾動塊的位置為“20”

 m_scroll.setscrollpos(20);

 //獲得文本框中的所有的資訊

 //替換文本框中的位置為“20”

 m_edit.replacesel("20"); 

***************************************************/

////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////

按鈕控件與清單框控件

按鈕控件

按鈕是最常見的控件之一

複選框(checkboxes) 常用于兩種完全相反狀态的情況下

單選按鈕(radiobuttons) 适用于同一組屬性相同的資料中選一個資料

下壓式按鈕(pushbuttons) 适用于消息的發送

分組框(group boxes) 沒有太多的操作隻是在視窗中劃分區域範圍

cbutton 及 cbitmapbutton類再mfc視窗類的層次結構中的位置

+-cobject

 +-ccmdtarget

  +-cwnd

   +-cbutton

    +-cbitmapbutton 

cbutton類中按鈕特有的樣式

樣式宏      說明

bs_3state     此樣式為複選框,但是方框可以被選中,也可以變暗(标明複選框無效)

bs_auto3state     此樣式為複選框,但是方框可以被選中,也可以變暗(标明複選框無效),當使用者選擇方框時,它的選中狀态會自動轉換

bs_autocheckbox    此樣式為複選框,當使用者選擇方框時,他的選中狀态會自動裝換

bs_autoridiobutton   此樣式為單選按鈕,當使用者選中圓圈時,按鈕自動顯示自己被選中的狀态,同僚使其它具有相同樣式的同組的單選按鈕處于未被選中的狀态。

bs_checkbox    建立一個複選框,預設情況下它的右邊有标題,當與bs_lefttext一起使用時,标題再左邊

bs_defpushbutton   建立一個下式按鈕

be_lefttext    當和一個單選按鈕或複選按鈕一起使用時,使得按鈕文字出現再按鈕的左邊

bs_ownerdraw    建立自定義按鈕,當按鈕視覺被改變時,mfc自動調用drawitem()方法在使用cbitmapbutton類時,這種樣式必須被指定

bs_pushbutton    建立一個下壓式按鈕,使用者單擊此按鈕時,向系統發送wm_command消息

bs_radiobutton    建立單選按鈕

cbutton的方法

方法     說明

getbitmap()    獲得setbitmap()設定的位圖的句柄

getbuttonstyle()   獲得有關按鈕控件樣式的資訊

getcheck()    獲得按鈕控件選中的狀态 

getcursor()    獲得通過setcursor()設定的圖示句柄

geticon()    獲得由seticon()設定的圖示句柄

getstate()    獲得按鈕控件的選中、選擇和聚焦狀态

setbitmap()    指定按鈕上顯示的位圖

setbuttonstyle()   改變按鈕樣式

setcheck()    設定按鈕控件的選中狀态

setcursor()    指定按鈕控件上的光标圖像

seticon()    指定按鈕上顯示的圖示

setstate()    設定按鈕控件的選擇狀态

cbitmapbutton(類定義的兩個初始化方法以增強按鈕的功能)

loadbitmaps() 

為cbitmapbutton對象附上位圖,最多可有4個位圖,這些位圖用于程式的資源檔案中讀取

autoload()

将對話框按鈕cbitmapbutton()對象連寫起來

有事必須調整位圖的尺寸大小,可以通過sizetocontent()方法進行調整。

mfc調用方法drawitem()自動再一個按鈕的使用者區上畫上位圖,即使用者可以自定義按鈕

清單框控件

    +-clistbox

mfc中clistbox類的層次結構

清單框常用于從總舵資料黃總選某一項

 清單框常用再對話框裡,如用清單框選擇檔案名,目錄等。清單框有一個預定義的鍵盤接口,使用者可以用鍵盤上的箭頭和pageup或pagedown鍵再清單框中盡心資料的選擇,或通過适當的樣式設定,允許與shift或ctrl鍵組合使用。

clistbox()控件可用的樣式

樣式    說明

lbs_disablenoscroll  當清單框不需要滾動條時,滾動條無效

lbs_extendsel   允許使用滑鼠及特殊鍵組合進行多項選擇

lbs_hasstrings   知名自繪的清單框,其中包括字元串選項

lbs_multicolumn   指明一個多列清單,它含有一個水準滾動條,可以setcolumnwindth()方法設定的寬度

lbs_multiplesel   使用者通過單擊或輕按兩下一項進行選擇或取消選擇

lbs_nointegralheinght  将清單框設定為建立指定的大小

lbs_noredraw   清單框在變化時不重繪,使用者可以再任何時候發送wm_setredraw消息改變這種模式

lbs_nosel   知名清單框包含隻能看不見選擇的項

lbs_notify   當使用者單擊或輕按兩下時向父視窗發送消息

lbs_ownerdrawfixed  指明清單框的所有者負責填寫清單項,且清單框具有相同的高度

lbs_ownerdrawvariable  知名清單框的所有者負責填寫清單項,且清單框可以不同高度

lbs_sort   清單項按字母順序排序

lbs_standard   此樣式是 lbs_notify、lbs_sort、ws_vscroll和ws_border的組合

lbs_usetabstops   告知清單框再加入字元串清單項時加入tab字元

lbs_wantkeyboardinput  允許應用程式通過發送wm_vkeytoitem 和wm_chartoitem消息給清單框的所有者來處理鍵盤輸入

消息映像項使用下面基本格式

on_message(controlid,classmethod)

controlid 發送消息的清單框控件的子視窗辨別

classmethod 處理消息的父類方法的名字

所有者類聲明中的方法原型

afx_msg void classmethod();

clistbox消息的消息映像項

消息映像項   說明

on_lbn_dblclk   當使用者輕按兩下選項時具有lbs_notify樣式的清單框向所有者發送此消息

on_lbn_errspace   清單框不能分貝足夠記憶體以滿足要求

on_lbn_killfocus  當清單框失去輸入焦點時出現此消息

on_lbn_selcancel  當取消目前清單框選擇時,具有lbs_notify樣式的清單框向所有者發送此消息

on_lbn_selchange  當清單框中的選擇改變時,具有lbs_notify樣式的清單框向它的父視窗發送此通知,如果選擇是用clistbox::setcutsel() 類方法改變的,則不發送通知。對多項選擇清單框來說,當使用者按箭頭鍵時,即使選擇不變也發送此通知

通用方法

 通用方法用來獲得和設定清單框資料的值和屬性,所有的clistbox 清單框都有這些方法,包括單選清單框、多選清單框和自繪制清單框等

通用clistbox類方法

方法   描述

getcount()  獲得清單框中清單項數目

gethorizontalextent() 獲得清單框的水準滾動寬度(按像素)

getitemdata()  獲得清單框項有關的32為值

getitemdataptr() 獲得指向清單框項的指針

getitemheight()  獲得清單框中項的高度

單項選擇特定方法

清單框的預設模式是單選項模式;所有的通用方法均使用于單選項清單框。

隻有兩個類方法專門處理單選項清單框

getcursel() 獲得目前選擇清單框項的下标(基于0)

setcursel() 選擇清單框字元串

多項選擇特定方法

方法    說明

getanchorindex()  獲得多選項選擇清單框中目前定位項的下标

getcaretindex()   獲得多項選擇清單框中具有貫标矩形的項的下标

getselcount()   獲得多項選擇清單框中目前所選的項的數目

getselitems()   将所有目前被選清單框項下标放入一整型數組緩存中

setitemrange()   切換多項選擇清單框項範圍的選擇狀态

setanchorindex()  再多項選擇清單框中擴充選擇設定開始(定位)項

setcaretindex()   在多項選擇清單框中指定下标項設定光标矩形 

setsel()   再多項選擇清單框中切換項目的選擇狀态

字元串指定的方法

addstring()   在清單框中删除一個字元串

deletestring()   從清單框中删除一個字元串

dir()    從目前目錄加檔案名放入清單框

findstring()   再清單框中搜尋一字元串

findstringexact()  在清單框中搜尋第一個與指定搜尋字元串比對的字元串

insertstring()   再清單框指定下标處插入一字元串

resetcontent()   清除清單框中的所有項

selectstring()   再單選清單框中搜尋并選擇一字元串

虛拟方法

clstbox類還聲明了幾個虛拟方法,你可以從clistbox類中派生一些類替換到你的類中

chartoitem()   可以替換此方法來為自繪清單框(沒有字元串)處理wm-char

compareitem()   由mfc調用以得到排序的自繪清單框中的新項的位置

deleteitem()   當使用者從自繪清單框中删除一項時mfc調用此方法

drawitem()   當确定自繪清單框項必須重繪時mfc調用此方法

measureitem()   當一自繪清單框被建立時mfc調用此方法類解決清單框的位數

vkeytoitem()   使用者可替換此方法,來處理具有lbs_wantkeyboarsinput樣式的清單框的wm_keydown

建立和初始化clistbox對象

(1)用c++關鍵字new 和構造函數clistbox::clistbox()

為clistbox對象配置設定一個執行個體

(2)初始化clistbox對象并賦于它一個windows清單框,通過方法clistbox::create()設定清單框的參數和樣式。

例如:下面代碼配置設定一個clistbox對象并傳回指向該對象的指針:

 clistbox *pmylistbox = new clistbox;

 指針pmylistbox用clistbox::create()方法進行初始化。

該方法聲明如下:

 bool create

(

  dword dwstyle, //dwstyle是清單框控件的視窗樣式

  const recy& rect, //是一個矩形,他知名控件的大小和位置

  cwnd* pparentwnd, //pparentwnd是指向控件所有者的指針

  uint nid      //nid是父視窗用來與清單框能信的控件辨別

);

                    更多技術文章請訪 www.vc258.com