青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

微塵--KeepMoving

為了忘卻的記憶
posts - 3, comments - 2, trackbacks - 0, articles - 13
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

摘要:本文主要介紹了如何通過窗口子類化技術來實現對編輯控件的限制輸入。

  關鍵詞:窗口,子類化,句柄, 消息。

  1.問題的提出

  盡管Windows系統提供了許多通用的控件如:Edit、ComboBox 、ListBox……等,有些情況下這些標準控件也無能為力。比如:在對學生成績考評過程中需要一個供教
師輸入評測等級的編輯控件,要求在編輯框內只能輸入A、B、C、D四個等級,這樣在編輯框內就禁止對其他字母或數字的操作。簡單地使用Windows的編輯框控件是不能對輸入字符進行有效過濾的,對于這類問題的解決,我們可以采用子類化的方法來實現編輯控件的限制輸入。

  2.實現方法

  每個應用程序為了登記一個窗口類,首先要填寫好一個WNDCLASS,其中的結構參數lpfnWndProc就是該類窗口函數的地址,接著調RegisterClass()函數向Windows系統申請登記這個窗口類。這時Windows會為其分配一塊內存來存放該類的全部信息,這個內存塊稱為窗口類內存塊。當應用程序要創建一個屬于某一已登記窗口類的窗口時,Windows便為這個窗口分配一塊內存,即窗口內存塊,用來存放與該窗口有關的專用信息。這些信息一部分來自傳遞給窗口創建函數CreateWindow() 或CreateWindowEx()的參數信息,另一部分則來自所屬窗口類的窗口類內存塊,其中參數lpfnWndProc便被Windows從窗口類內存塊復制到為新創建窗口分配的窗口內存塊中。當有消息被發送到這個窗口時,Windows檢查該窗口內存塊中的窗口函數地址(lpfnWndProc),并調用該地址上的函數來處理這些消息。

  所謂窗口子類化,實際上就是改變窗口內存塊中的有關參數。由于這種修改只涉及到一個窗口的窗口內存塊,因此它不會影響到屬于同一窗口類的其它窗口的功能和表現。窗口子類化中最常見的是修改窗口內存塊中的窗口函數地址(lpfnWndProc),使其指向一個新的窗口函數,從而改變原窗口函數的處理方法,改進其功能。

  3. 實現過程

   首先利用MFC建立一個基于對話框的應用程序NewDialg; 在對話框中添加一個ID為IDC_DEIT1的編輯控件資源。

  并派生一個自己的類CNewEdit (它的基類為CEdit)。通過這個類實現對該編輯控件的限制輸入。

  (1) 處理CNewEdit的消息函數OnChar:

  void CNewEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {

   TCHAR ch[20];

   GetWindowText(ch,20);

  //處理只能輸入A,B,C,D的情況

  if (strlen(ch) == 1 && (nChar <= ‘D‘ && nChar >= ‘A‘)) return;

  if (nChar != ‘A‘ && nChar != ‘B‘ && nChar != ‘C‘ && nChar!= ‘D‘ ) return;

  CEdit::OnChar(nChar, nRepCnt, nFlags);

  }

  (2) 為CNewDialogDlg類中添加一個數據成員CNewEdit m_edit,并在CtestDlg::OnInitDialog( )中加入下面代碼:

  m_edit.SubclassDlgItem(IDC_EDIT1,this);

   m_edit.SetWindowText("<請輸入A、B、C、D>"); //提示可以輸入的內容

  (3)處理ID為IDC_EDIT1的控件向對話框發送的通知消息:EN_SETFOCUS:

  void CNewDialogDlg::OnSetfocusEdit1( ) {

  // TODO: Add your control notification handler code here

   m_edit.SetWindowText("");

   m_edit.SetFocus( );}

 

  4 過程分析

  下面我們看一下m_edit如何控制程序中資源編號為:IDC_EDIT1的控件的。

  大家都知道,控制Windows窗口、控件、資源……都是通過它們的句柄來實現,如HHANDLE、HWND、HDC都是句柄,它表現為一個32位長整形數據,存放于Windows中的特定區域,我們可以把它理解為指向我們想控制的窗口、控件、資源的索引,有了它,我們就可以控制我們想要控制的對象。

  那么CNewEdit的數據成員m_edit要想控制IDC_EDIT1,也要通過它的句柄,這就要通過SubclassDlgItem函數來實現。

  BOOL CWnd::SubclassDlgItem(UINT nID, CWnd* pParent){

  ASSERT(pParent != NULL);

  ASSERT(::IsWindow(pParent->m_hWnd));

  // check for normal dialog control first

  HWND hWndControl = ::GetDlgItem(pParent->m_hWnd, nID);

  if (hWndControl != NULL)

   return SubclassWindow(hWndControl);

  ……

  }

  SubclassDlgItem函數是CWnd的一個成員函數,它開始時對傳入的父窗口做些檢查,然后就是先用hWndControl得到我們IDC_EDIT1控件的句柄,再調用SubclassWindow函數,這個函數是實現的關鍵。

  BOOL CWnd::SubclassWindow(HWND hWnd){

  if (!Attach(hWnd))

   return FALSE;

  ……

  WNDPROC oldWndProc = (WNDPROC)::SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)AfxGetAfxWndProc());

  ……

  }

  在這個函數中,首先調用了Attach函數,將hwand這個窗口句柄與一個窗口對象連接,在Attach函數中,有重要的一句: pMap->SetPermanent(m_hWnd = hWndNew, this); 顯然只要把窗口的句柄保存下來,就可以在系統中唯一地指定一個窗口,然后對該窗口進行操作。在Attach 函數中把IDC_EDIT1 的句柄保存在了CnewEdit的成員變量m_hWnd 中,那么在m_edit.SetWindowText("<請輸入A、B、C>")中,正是通過這個數據成員m_hWnd實現對IDC_EDIT1控制的:

  void CWnd::SetWindowText(LPCTSTR lpszString){

  ASSERT(::IsWindow(m_hWnd));

  if (m_pCtrlSite == NULL)  

  ::SetWindowText(m_hWnd, lpszString);

  else    

  m_pCtrlSite->SetWindowText(lpszString);

  }

  雖然通過句柄實現了m_edit對IDC_EDIT1的控制,對CNewEdit的WM_CHAR的處理是還要通過SubclassWindow函數來實現,在SubclassWindow中有這樣一句:

  WNDPROC oldWndProc = (WNDPROC)::SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)AfxGetAfxWndProc());

  其中AfxGetAfxWndProc()是我們自己的窗口處理函數,在其中處理過我們感興趣的消息后,通過返回的原窗口處理函數指針oldWndProc來把其它消息按標準方法處理掉,這樣當程序收到發給Edit的WM_CHAR時,本應調用EDIT標準窗口處理函數,現在被改為調用LRESULT CALLBACK AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)了,然后WM_CHAR消息進行一系列的過程,最終成功到達我們的處理函數CNewEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags), 實現對編輯控件的限制輸入。

 

  參考文獻:

  [1] aaaaaaaaaawww.msdn.com

  [2] 楊曉鵬 《Visual C++ 7.0 實用編程技術》 北京 中國水利水電出版社。


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久久久免费a∨大胸 | 久久成人人人人精品欧| 99国产精品国产精品久久| 欧美精品aa| 一区二区三区欧美视频| 99视频一区二区| 国产精品你懂的在线| 欧美一区在线看| 久久久久久亚洲综合影院红桃 | 亚洲第一综合天堂另类专| 久久综合影音| 美女主播精品视频一二三四| 91久久久亚洲精品| av成人老司机| 国产专区综合网| 亚洲国产日韩欧美在线99| 欧美女同视频| 欧美一区二区三区喷汁尤物| 久久美女艺术照精彩视频福利播放| 亚洲国产日韩一区| 一区二区电影免费在线观看| 国产欧美丝祙| 亚洲激情视频网| 国产麻豆日韩| 亚洲国产视频直播| 国产日韩在线不卡| 欧美激情综合色| 国产精品视频成人| 亚洲国产精品一区| 国产欧美日韩专区发布| 最新中文字幕亚洲| 国产一区二区日韩精品欧美精品 | 亚洲女爱视频在线| 久久国产精品99精品国产| 91久久久久久久久久久久久| 亚洲性夜色噜噜噜7777| 亚洲日韩欧美视频| 欧美一二三区在线观看| 亚洲一区www| 免费观看一区| 久久久91精品| 国产精品午夜av在线| 亚洲国产精品999| 国产婷婷精品| 亚洲天堂偷拍| 99在线精品免费视频九九视| 久久精品首页| 久久高清一区| 国产九区一区在线| 夜夜夜久久久| 一本色道久久综合狠狠躁篇的优点 | 一区二区高清| 欧美成人精品高清在线播放| 久久婷婷激情| 国内精品伊人久久久久av影院| 一本久道久久久| 亚洲视频一区在线| 欧美精品一区在线播放| 亚洲二区三区四区| 在线观看亚洲视频| 久久久久国产精品人| 久久国产一区二区三区| 国产精品综合av一区二区国产馆| 在线亚洲+欧美+日本专区| 一区二区三区.www| 欧美欧美天天天天操| 亚洲国产va精品久久久不卡综合| 亚洲福利国产精品| 另类酷文…触手系列精品集v1小说| 久久久人成影片一区二区三区 | 国产区精品视频| 午夜精品一区二区三区电影天堂 | 亚洲欧美精品| 国产精品国产馆在线真实露脸| 一本久久综合亚洲鲁鲁| 亚洲专区一区| 国产美女诱惑一区二区| 午夜精品久久久久久久99樱桃 | 久久夜色精品国产| 黄色精品一二区| 久久夜色精品亚洲噜噜国产mv| 免费人成精品欧美精品| 亚洲精品一区中文| 欧美日韩久久不卡| 亚洲综合第一| 久久精品视频一| 亚洲国产三级| 欧美午夜久久久| 欧美一二三视频| 欧美激情一二区| 一本色道久久综合亚洲精品按摩| 国产精品成人久久久久| 久久国产天堂福利天堂| 亚洲国产精品久久久久婷婷884| 一区二区三区产品免费精品久久75| 国产精品久久久久久av福利软件| 香蕉久久精品日日躁夜夜躁| 欧美激情一区二区三区成人| 亚洲一区二区久久| 激情欧美丁香| 欧美日韩一区二区免费视频| 香蕉尹人综合在线观看| 欧美激情偷拍| 欧美在线一级va免费观看| 亚洲国产精品成人综合| 欧美日韩精品一区| 欧美一区二区三区免费视频| 最新日韩在线视频| 久久福利毛片| 亚洲午夜精品久久| 极品少妇一区二区| 国产精品成人观看视频国产奇米| 久久久久久综合| 亚洲一区二区在线播放| 欧美激情视频一区二区三区免费| 欧美伊人久久久久久午夜久久久久 | 欧美日韩在线三区| 久久青草久久| 香蕉成人啪国产精品视频综合网| 91久久亚洲| 欧美成黄导航| 销魂美女一区二区三区视频在线| 91久久午夜| 国产综合亚洲精品一区二| 欧美日韩在线播放三区| 欧美 日韩 国产精品免费观看| 午夜精品亚洲一区二区三区嫩草| 亚洲精品免费在线播放| 免费观看在线综合| 欧美自拍偷拍午夜视频| 亚洲网站视频福利| 日韩午夜激情av| 亚洲欧洲在线看| 在线观看国产日韩| 狠狠噜噜久久| 国产一区二区久久| 国产夜色精品一区二区av| 国产精品人成在线观看免费| 国产精品成人aaaaa网站| 欧美精品1区2区3区| 欧美chengren| 欧美国产精品一区| 免费不卡中文字幕视频| 美女精品在线观看| 老司机精品导航| 久久综合国产精品| 久久天堂精品| 欧美高清视频www夜色资源网| 欧美3dxxxxhd| 欧美日韩成人在线播放| 欧美精品国产一区| 欧美三区免费完整视频在线观看| 欧美日韩精品一区| 国产精品国产三级国产普通话99| 国产精品久久久久高潮| 国产精品久久久久久久免费软件 | 久久精品久久99精品久久| 久久成人这里只有精品| 久久精视频免费在线久久完整在线看| 久久久久久9| 欧美成人精品| 欧美性猛片xxxx免费看久爱| 国产日韩成人精品| 在线免费观看日韩欧美| 亚洲精品护士| 午夜视频一区在线观看| 久久免费的精品国产v∧| 欧美91精品| 日韩亚洲欧美成人一区| 亚洲网站啪啪| 久久手机精品视频| 欧美精品www在线观看| 国产精品久久久久永久免费观看 | 国色天香一区二区| 亚洲电影第1页| 在线一区二区三区做爰视频网站| 欧美在线你懂的| 亚洲第一级黄色片| 在线亚洲欧美专区二区| 久久久久久自在自线| 欧美日韩国产首页在线观看| 国产视频精品xxxx| 日韩一级精品| 久久久久天天天天| 亚洲理论在线观看| 久久精品99| 欧美日韩在线视频首页| 亚洲成在人线av| 欧美一区二区三区四区夜夜大片| 欧美搞黄网站| 欧美在线免费视频| 欧美日韩亚洲视频一区| 1024日韩| 欧美夜福利tv在线| 亚洲精品女av网站| 欧美一区二区三区免费在线看 | 欧美精品福利视频| 精品不卡在线| 久久aⅴ国产欧美74aaa| 亚洲精品色婷婷福利天堂|