婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > windows開(kāi)發(fā)記事本程序紀(jì)實(shí)(二)邏輯篇1

windows開(kāi)發(fā)記事本程序紀(jì)實(shí)(二)邏輯篇1

熱門標(biāo)簽:去哪里辦卡 無(wú)錫電銷機(jī)器人銷售 招聘信息 鄭州中國(guó)移動(dòng)400電話申請(qǐng) 地圖標(biāo)注植物名稱 揭陽(yáng)外呼系統(tǒng)公司 南召400電話辦理資費(fèi) 福建ai電銷機(jī)器人加盟公司 熱血傳奇沃瑪森林地圖標(biāo)注 地圖標(biāo)注審核工作怎么樣注冊(cè)

1. 主要內(nèi)容

從本節(jié)開(kāi)始介紹windows開(kāi)發(fā)實(shí)現(xiàn)記事本程序的邏輯實(shí)現(xiàn)部分。本節(jié)的主要內(nèi)容有以下3點(diǎn):

1. 主窗口定義 —— 主要介紹記事本主界面窗口對(duì)應(yīng)的窗口類及實(shí)現(xiàn)方案

2. RichEdit控件的選用及初始化 —— 記事本程序中編輯控件的選擇及使用

3. 整個(gè)程序ICON的選擇。—— 程序ICON設(shè)置

2. 實(shí)際開(kāi)發(fā)

2.1 主窗口實(shí)現(xiàn)

在上一篇介紹界面的實(shí)現(xiàn)中只是給出了運(yùn)行界面的效果,但是當(dāng)時(shí)那個(gè)界面程序不能響應(yīng)任何的windows消息,因?yàn)楫?dāng)時(shí)的窗口在創(chuàng)建時(shí)將窗口對(duì)應(yīng)的過(guò)程處理函數(shù)設(shè)置為NULL。現(xiàn)在,我們需要將相應(yīng)的過(guò)程處理函數(shù)添加上使得這個(gè)記事本應(yīng)用程序可以響應(yīng)我們發(fā)出的一系類操作指令。為此,本文在開(kāi)發(fā)時(shí),單獨(dú)設(shè)計(jì)了一個(gè)用于保存主界面窗口的類CMainWnd。這個(gè)類定義了整個(gè)窗口的過(guò)程處理函數(shù)Main_Porc。在Main_Proc中可以對(duì)傳入的任何消息進(jìn)行處理(包括初始化窗口消息,窗口中其他控件的消息,關(guān)閉窗口消息等等)。以windows 自帶記事本為例,如圖1所示

圖1 windows主窗口消息效應(yīng)區(qū)域

如上圖所示,在windows記事本主界面中,需要響應(yīng)紅色矩形區(qū)域內(nèi)的菜單控件的各類消息、響應(yīng)黃色矩形區(qū)域內(nèi)系統(tǒng)按鈕的相關(guān)消息,以及相應(yīng)編輯控件Edit中的消息。對(duì)于主窗口中的各類控件的消息,windows會(huì)以WM_COMMAND消息進(jìn)行傳輸,這也是整個(gè)程序的核心處理區(qū)域。系統(tǒng)按鈕關(guān)閉的消息則是WM_CLOSE。窗口初始化消息WM_INITDIALOG則是構(gòu)建對(duì)話框窗口前發(fā)出的初始化消息。為了能夠響應(yīng)上述各類消息,需要在CMainWnd中添加對(duì)于這幾類消息的響應(yīng)函數(shù),因此整個(gè)CMainWnd的基本實(shí)現(xiàn)形式如下:

頭文件聲明:

/************************************************************************/
/* file  : CMainWnd.h 
 * author : Huagang Li
 * date  : 2014-8-30 15:29:42
 * blogs : http://www.cnblogs.com/lhglihuagang/
 * tips  : 主窗口實(shí)現(xiàn)類, 實(shí)現(xiàn)窗口的過(guò)程函數(shù),消息響應(yīng)函數(shù)等
 */
/************************************************************************/
#ifndef _MAIN_WND_H
#define _MAIN_WND_H

#include Windows.h>
//////////////////////////////////////////////////////////////////////////
// CMainWnd 主窗口類,提供

class CMainWnd
{
public:
  static BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  static BOOL Main_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam);
  static void Main_OnCommand(HWND hWnd, int id, HWND hWndCtl, LPARAM lParam);
  static void Main_OnClose(HWND hWnd);

private:
  static HWND hMainWnd;  // 主窗口句柄
};


#endif

CMainWnd具體定義:


#include "MainWnd.h"
include WindowsX.h>
//////////////////////////////////////////////////////////////////////////
// static data members
HWND CMainWnd::hMainWnd = NULL;
//////////////////////////////////////////////////////////////////////////
// static function members
// 主窗口的過(guò)程函數(shù),根據(jù)消息類型處理各類消息
BOOL WINAPI CMainWnd::Main_Proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
 switch (uMsg)
 {
 HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
 HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
 HANDLE_MSG(hWnd, WM_CLOSE, Main_OnClose);
 }
/span>span style="color: #0000ff">return/span>span style="color: #000000"> FALSE;
}
BOOL CMainWnd::Main_OnInitDialog( HWND hWnd, HWND hWndFocus, LPARAM lParam )
{
 return TRUE;
}
// id為具體空間的ID號(hào),可以在resource中定義有意義的控件ID,如“打開(kāi)文件”可以設(shè)置
// 為ID_FILE_OPEN
void CMainWnd::Main_OnCommand( HWND hWnd, int id, HWND hWndCtl, LPARAM lParam )
{
 switch (id)
 {
 //
 }
}
void CMainWnd::Main_OnClose( HWND hWnd )
{
 ::EndDialog(hWnd, NULL);
}

在定義了CMainWnd后,在main函數(shù)處的DialogBox處添加主窗口的過(guò)程處理函數(shù)


::DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, CMainWnd::Main_Proc);

完成上述步驟運(yùn)行后,就可以看到啟動(dòng)后的主界面可以響應(yīng)窗口上系統(tǒng)按鈕“關(guān)閉”,但是對(duì)于菜單控件的消息,因?yàn)橄㈨憫?yīng)此還是函數(shù)中數(shù)什么都沒(méi)有做,因此還是不會(huì)進(jìn)行任何處理。

2.2 RichEdit控件的選用

      對(duì)于一個(gè)記事本程序來(lái)說(shuō),主界面上核心區(qū)域還是編輯區(qū)域。但是當(dāng)前記事本程序中還沒(méi)有選擇任何編輯控件。通過(guò)觀察現(xiàn)有windows控件列表可以看出,適合編輯控件的有Edit Control以及Rich Edit2.0 Control。對(duì)于這兩種編輯控件,Edit Control較為簡(jiǎn)單,但是響應(yīng)的功能也較少。Rich Edit2.0 Control實(shí)現(xiàn)起來(lái)較為復(fù)雜,但是對(duì)應(yīng)的功能也多了不少(例如可以改變字體顏色,字號(hào)等等)。本文希望能夠?qū)崿F(xiàn)一個(gè)功能較強(qiáng)的記事本,因此選擇了Rich Edit2.0 Control進(jìn)行后續(xù)開(kāi)發(fā)。插入了Rich Edit2.0 Control后,主界面窗口對(duì)應(yīng)的資源視圖如圖2所示:


圖2 IDD_MAIN中插入Rich Edit2.0 Control

      上述步驟運(yùn)行后,本以為可以看到帶有編輯界面的記事本程序,可是實(shí)際上程序運(yùn)行后沒(méi)有任何效果,甚至主界面都不能正常啟動(dòng)了。百度后發(fā)現(xiàn),對(duì)于richedit啟動(dòng)失敗的方法都是針對(duì)MFC程序來(lái)說(shuō)的,需要添加初始化函數(shù)AfxInitRichEdit2。但是現(xiàn)在使用windows API 開(kāi)發(fā),并沒(méi)有AfxInitRichEdit2這個(gè)函數(shù),只能另尋他路了。終于在一篇博文中http://blog.csdn.net/dijkstar/article/details/7953816提到,原來(lái)上面那個(gè)初始化函數(shù)中主要是加載RichEdit依賴的dll,那么整個(gè)問(wèn)題就豁然開(kāi)朗了,我們只需要在主窗口啟動(dòng)前手動(dòng)的載入這個(gè)dll就可以了。因此在主函數(shù)的DialogBox前添加了依據(jù)載入dll的操作如下:

::LoadLibrary(T("riched20.dll"));

MAIN的properties中:

此時(shí)再運(yùn)行程序時(shí),可以正常啟動(dòng)記事本了,且能夠在richedit中進(jìn)行編輯,效果如圖3所示:


圖3 手動(dòng)加載Riched20.dll后出現(xiàn)主界面窗口

      在啟動(dòng)主界面后,可以正常進(jìn)行編輯。貌似這個(gè)控件可以正常工作了。但在實(shí)際測(cè)試時(shí),發(fā)現(xiàn)了以下幾個(gè)問(wèn)題:

1. 界面運(yùn)行后RichEdit邊框棱角過(guò)于分明

    處理方法: Richedit控件的properties  -> Boarder –> Flase

2.輸入Enter 不能換行(手動(dòng)輸入時(shí)一直在同一行編輯)

   處理方法: Richedit控件的properties  -> Multiline–> True

                      Richedit控件的properties  -> Want Return–> True

3. 沒(méi)有滾動(dòng)條(橫向以及縱向的)

    這個(gè)在主界面屬性上,IDD

   處理方法: IDD_MAIN-> properties  -> Horizontal Scrollbar–> True

                      IDD_MAIN –> properties  -> Vertical Scrollbar–> True

4. 不能隨窗口大小伸縮

    在對(duì)窗口進(jìn)行伸縮時(shí),RichEdit控件的大小還是保持原來(lái)的大小,如圖4所示:


圖4 主界面大小變化時(shí)RichEdit控件大小不變

    這個(gè)問(wèn)題其實(shí)很好理解,因?yàn)樯炜s主界面窗口時(shí),windows將發(fā)送WM_SIZE消息通知窗口。這個(gè)過(guò)程類似于windows對(duì)主界面窗口說(shuō)“hi, 你的大小已經(jīng)變了,你根據(jù)改變后的大小變一下”。現(xiàn)在我們的主窗口過(guò)程處理函數(shù)中并沒(méi)有針對(duì)WM_SIZE消息對(duì)RichEdit進(jìn)行特殊處理,因此主界面下面的RichEdit一直保持自己原來(lái)的大小,才會(huì)出現(xiàn)上面的情況。那么具體的解決方案為:在InitDialog中添加RichEdit大小自適應(yīng)功能,同時(shí)針對(duì)WM_SIZE消息,添加Main_OnSize函數(shù)來(lái)處理這種獨(dú)立的控件。具體的代碼實(shí)現(xiàn)如下:

void CMainWnd::Main_OnSize( HWND hWnd, UINT state, int cx, int cy )
{
 RECT stRect;
 ::GetClientRect(hWnd, stRect); // 獲取窗口客戶區(qū)大小
/span>span style="color: #008000">///span>span style="color: #008000"> 將RichEdit大小調(diào)整為客戶區(qū)大小/span>
 ::MoveWindow(::GetDlgItem(hWnd, IDC_RICHEDIT), stRect.left, stRect.top,
 stRect.right-stRect.left, stRect.bottom-stRect.top, TRUE);
}

這里只是在CMainWnd中添加了對(duì)于WM_SIZE的消息響應(yīng)函數(shù),要讓RichEdit響應(yīng)這個(gè)消息,還需要在Main_Proc中添加相應(yīng)過(guò)程

HANDLE_MSG(hWnd, WM_SIZE, Main_OnSize);

這樣,RichEdit也就可以跟著主窗口大小自由伸縮了。上述過(guò)程處理函數(shù)中,主要調(diào)用了三個(gè)基本的API接口。

1. GetClientRect,這個(gè)API用于獲取客戶區(qū)大小,RichEdit伸縮的大小就是這個(gè)大小值

2. GetDlgItem 獲取窗口下某一個(gè)控件的句柄,例如GetDlgItem(hWnd, IDC_RICHEDIT),就可以獲得主窗口下RichEdit控件對(duì)應(yīng)的句柄。

3. MoveWindow。它的第一個(gè)參數(shù)就是需要進(jìn)行位置大小變化的窗口句柄。我們這里將2中的RichEdit句柄傳入,后面的參數(shù)分別是矩形區(qū)域的left點(diǎn),top點(diǎn),width值以及height值。最后一個(gè)參數(shù)用來(lái)表示大小改變后要不要重繪窗口。注意,這里選擇了TRUE。如果選擇FALSE,會(huì)出現(xiàn)以下這種情況:當(dāng)將窗口變小后,在進(jìn)行變大操作,RichEdit并沒(méi)有立即適應(yīng)變大后的區(qū)域,還是保留在原來(lái)變小的區(qū)域。效果如圖5所示:

圖5 MoveWindows中參數(shù)repaint設(shè)置為FALSE后潛在問(wèn)題

基于此,我們?cè)谟肕oveWindow改變窗口大小時(shí),最好使得repaint為TRUE,保證實(shí)時(shí)改變。

2.3 主程序ICON設(shè)計(jì)

      在上述截圖中可以看出,主界面的左上角ICON一直是windows自帶的ICON。為了與windows自帶記事本做到類似,直接到網(wǎng)上找了一個(gè)類似的JPG圖標(biāo)轉(zhuǎn)為ICO,然后設(shè)置了程序的ICON。具體的圖標(biāo)設(shè)置方法請(qǐng)參考http://www.cnblogs.com/lhglihuagang/p/3927283.html

      在圖標(biāo)設(shè)置后,可以運(yùn)行程序查看下最新的效果,如圖6所示


圖6 設(shè)置程序圖標(biāo)后的結(jié)果

      最后,對(duì)話框窗口的標(biāo)題Dialog實(shí)在顯得有些另類,這里根據(jù)windows自帶記事本的標(biāo)題“無(wú)標(biāo)題 - 記事本”,將這個(gè)值進(jìn)行了相應(yīng)的修改,具體為IDD_MAIN-> properties  -> Caption –> 無(wú)標(biāo)題 - 記事本最后,對(duì)話框.

3. 運(yùn)行結(jié)果

在添加了CMainWnd以及RichEdit后,整個(gè)程序的運(yùn)行后效果如下圖7所示:


圖7 本節(jié)程序改動(dòng)后的效果

4. 結(jié)論

    1. 使用RichEdit控件時(shí),需要手動(dòng)加載riched20.dll,否則程序運(yùn)行后沒(méi)有任何界面效果

      2. RichEdit換行、滾動(dòng)條、邊框都可以通過(guò)properties中相應(yīng)字段進(jìn)行設(shè)置

      3. 需要在CMainWnd中添加WM_SIZE消息響應(yīng)函數(shù),保證RichEdit自由伸縮。

5. 參考鏈接

      [1] http://blog.csdn.net/dijkstar/article/details/7953816

    [2] http://www.cnblogs.com/lhglihuagang/p/3927283.html

    [3] http://msdn.microsoft.com/en-us/library/ms633534(VS.85).aspx

6. 說(shuō)明

     這將是一個(gè)系列博文,后面會(huì)繼續(xù)補(bǔ)充邏輯功能的開(kāi)發(fā)的步驟。希望能與更多博友交流。 如果你覺(jué)得這篇文章還可以,請(qǐng)點(diǎn)贊,哈哈~~
      聲明:未作說(shuō)明,則本文為年糕原創(chuàng)。      注意:轉(zhuǎn)載須保留全文,如需修改請(qǐng) 聯(lián)系作者。

您可能感興趣的文章:
  • windows開(kāi)發(fā)記事本程序紀(jì)實(shí)(一)界面篇

標(biāo)簽:黔南 鹽城 景德鎮(zhèn) 東莞 文山 南昌 桂林 宣城

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《windows開(kāi)發(fā)記事本程序紀(jì)實(shí)(二)邏輯篇1》,本文關(guān)鍵詞  windows,開(kāi)發(fā),記事本,程序,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《windows開(kāi)發(fā)記事本程序紀(jì)實(shí)(二)邏輯篇1》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于windows開(kāi)發(fā)記事本程序紀(jì)實(shí)(二)邏輯篇1的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 贵定县| 乐东| 鄯善县| 呼伦贝尔市| 上杭县| 湖南省| 霍州市| 广汉市| 三原县| 彭州市| 金门县| 北流市| 邮箱| 平顶山市| 铅山县| 晋宁县| 陕西省| 宁都县| 凤城市| 灵璧县| 紫金县| 济宁市| 故城县| 宿迁市| 合江县| 天门市| 思茅市| 扶余县| 乐亭县| 额济纳旗| 青河县| 进贤县| 金阳县| 怀柔区| 田东县| 丰都县| 岳普湖县| 平江县| 荣昌县| 铜梁县| 芒康县|