天天看點

MFc界面添加滾動條筆記

2012-4-23

2.The Fingerprint Contrast and Analysis System

3.參照書上代碼将程式背景圖檔處理好。

4.add new image 視窗出現時大小正好為整個客戶區

CRect rect;

pView->GetClientRect(rect);

ClientToScreen(rect);

pDlg->MoveWindow(rect);

5.vc6的風格轉換為 vs2008的風格

解決方案:stdafx.h檔案裡

加上

#if defined _M_IX86

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

#elif defined _M_IA64

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")

#elif defined _M_X64

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")

#else

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

#endif

7.改變程式tittle

----在程式建立之前,架構類中可以如下形式建立:

        cs.style&=~FWS_ADDTOTITLE;//取反後與,現有類型做于操作即可去掉這個類型

 cs.lpszName=_T("The Fingerprint Contrast and Analysis System");

-----在程式建立之後,可以再oncreat()函數中如下建立

SetWindowLong();

-----程式建立之前:

 WNDCLASS wndcls;

 wndcls.cbClsExtra=0;

 wndcls.cbWndExtra=0;

 wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);   //建立有顔色的背景畫刷,這一句必須有。

 wndcls.hCursor=LoadCursor(NULL,IDC_HELP);          //選擇help的cursor

 wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);

 wndcls.hInstance=AfxGetInstanceHandle();

 wndcls.lpfnWndProc=::DefWindowProc;

 wndcls.lpszClassName=_T("The Fingerprint Contrast and Analysis System");

 wndcls.lpszMenuName=NULL;

 wndcls.style=CS_HREDRAW |CS_VREDRAW;          //橫向重繪,縱向重繪

 RegisterClass(&wndcls);

 cs.lpszClass=_T("The Fingerprint Contrast and Analysis System");

在架構視窗中,隻能改變視窗title的圖示。

而改變背景和,滑鼠的圖示應該在view類中改變

cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadIcon(NUll,IDI_WARING));

----程式建立之後:架構類Oncreat()中

SetClassLong

---動态圖示的建立

----1.首先導入圖示,添加HICON變量類型m_hicons[]

----2.oncreate()函數中

 m_hicons[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

 m_hicons[1]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON2));

 m_hicons[2]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON3));

 m_hicons[3]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON4));

 m_hicons[4]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON5));

 SetTimer(1,500,NULL);

----3.相應onTime()時間

 static int index=0;

 SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hicons[index]);

 index=++index%5;

8.建立菜單快捷按鈕隻需要id何菜單相同即可

9.給程式右下角添加時間,在架構類中添加

------1,添加靜态字元串資源

 static UINT indicators[] =

 {

 ID_SEPARATOR,           // status line indicator

 IDS_TIMER,

 IDS_PROGRESS,

 ID_INDICATOR_CAPS,

 ID_INDICATOR_NUM,

 ID_INDICATOR_SCRL,

 };

 并注冊

-----2,添加下列代碼擷取時間,需要在timer中添加

   CTime t=CTime::GetCurrentTime();

 CString str=t.Format("%H:%M:%S");//得到時間後格式化

 CClientDC dc(this);

 CSize sz=dc.GetTextExtent(str);//得到字型時間的長度

 m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);

 m_wndStatusBar.SetPaneText(1,str);

10.建立進度欄

----1.首先構造進度欄對象CProgressCtrl m_progress;

----2.oncreat()函數傳回之前建立進度欄

----3.自定義一個消息,隻要比WM_USER 大即可,

 #define UM_PROGRESS  WM_USER+1

 并且做消息響應函數原型的聲明,(注釋宏的下面)

 afx_msg LRESULT OnProgress(WPARAM wParam, LPARAM lParam);

----4.進行消息映射ON_MESSAGE

----5.定義函數

 LRESULT CMainFrame::OnProgress(WPARAM wParam, LPARAM lParam)

{

 CRect rect;

 m_wndStatusBar.GetItemRect(2,&rect);

 m_progress.Create( WS_CHILD | WS_VISIBLE | PBS_SMOOTH,

  rect,&m_wndStatusBar,123);

 m_progress.SetPos(0);

 return true;

}

----6.onCreate()後發送消息

SendMessage(UM_PROGRESS);直接把消息響應函數發送給消息響應函數,完後再傳回。沒有達到直接從此處發送消息的目的

PostMessage(UM_PROGRESS);将消息放置在消息隊列當中,執行時間靠後,等create完成後再建立滾動條

若注釋起來,則上述函數便不會執行。

----7.增加OnPaint()消息處理

 在視窗重繪的時候,從新讓進度條出現

 複制定義函數的代碼,會出現問題----進度條已經建立了,并且和類進行了關聯,再次建立會出現問題

是以需要如下代碼:

 if(!m_progress.m_hWnd)

  m_progress.Create(WS_CHILD | WS_VISIBLE ,//| PBS_SMOOTH,

   rect,&m_wndStatusBar,123);

 else

  m_progress.MoveWindow(rect);

 m_progress.SetPos(50);

----8.進度條的移動

 timer中////////////////////////////////////////////////進度條顯示

 m_progress.StepIt();

SkinSharp收費,但是可以使用試用版,還是可以滿足咱的需求的,總比MFC本身的界面好,那顔色...拿不出手啊....

使用很簡單,就下面幾個步驟:

1.

拷貝.h檔案和.lib檔案到程式目錄下;

2. 在工程的stdafx.h 頭檔案,添加以下代碼:

        #include "SkinH.h"

#pragma comment (lib,"SkinHu.lib")

     3. 對話框初始化函數OnInitDialog()裡面添加以下代碼,加載皮膚:SkinH_Attach(); 這個方法隻加載試用版預設的皮膚。

     4. 編譯下工程,産生Debug或Release檔案夾,把DLL檔案(SkinHu.dll )和皮膚檔案(skinh.she )拷貝到此。

     這樣就行了。其實很多皮膚的使用方法都很簡單,基本上就是拷貝一下.dll和.lib以及頭檔案,然後在程式中加幾行代碼。但是由于絕大部分皮膚都收費,還有可能因為版本、程式設計環境等原因,很多皮膚都用不上,目前為止在我電腦上能用的皮膚就SkinSharp和SkinPlusPlus,這兩個使用都簡單。但SkinPlusPlus會截獲OnTimer()等方法,很讓人郁悶,不知道SkinSharp如何,用着再說。