久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

孫鑫VC視頻教程筆記之第九課“程序外觀修改及工具欄狀態(tài)欄編程”

 Alex@ZW 2010-11-04
1.      在窗口創(chuàng)建之前修改窗口外觀:

The framework calls PreCreateWindow just prior to creating the window. By modifying the CREATESTRUCT parameter to PreCreateWindow, your application can change the attributes used to create the window.

 

修改窗口的標題:通過修改CREATESTRUCT結(jié)構(gòu)體中的lpszName,,但是注意,,FWS_ADDTOTITLE is an MFC-specific style that instructs the framework to add the document title to the window’s caption,所以必須將FWS_ADDTOTITLE從現(xiàn)有的style中去除FWS_ADDTOTITLE,,即使cs.style & ~FWS_ADDTOTITLE

 

對于窗口的類型和大小,,是在創(chuàng)建窗口的時候設定的,而窗口的圖標,,光標,,背景是在設計窗口設計類的時候的設定的,是由MFC底層代碼設計,,但可以自己創(chuàng)建窗口類,,然后讓系統(tǒng)按照自己定義的窗口類執(zhí)行。將以下代碼放在CMainFrame類的PreCreateWindow函數(shù)中添加:

WNDCLASS wndcls;

      wndcls.cbClsExtra=0;

      wndcls.cbWndExtra=0;

wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); //設置窗口背景為黑色

      wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);

      wndcls.hIcon=LoadIcon(NULL,IDI_WARNING);

      wndcls.hInstance=AfxGetInstanceHandle();

      //因為MFC本身也有DefWindowProc函數(shù),,但參數(shù)不一致,,所以還是調(diào)用win32的函數(shù)

wndcls.lpfnWndProc=::DefWindowProc; //不想修改系統(tǒng)操作,所以調(diào)用系統(tǒng)默認的回調(diào)函數(shù)

      wndcls.lpszClassName="style test";

      wndcls.lpszMenuName=NULL;

      wndcls.style=CS_HREDRAW | CS_VREDRAW;

     

      RegisterClass(&wndcls);

cs.lpszClass="style test"//按照自己的設計創(chuàng)建

 

運行以上代碼后發(fā)現(xiàn)窗口圖標改變了,但光標和背景沒有改變,,這是因為上述代碼修改是框架類,,光標和背景屬于View類,所以還要在View類中PreCreateWindow修改,。在實現(xiàn)上述代碼后,,在CViewPreCreateWindow函數(shù)中添加如下代碼就可以實現(xiàn)修改光標和背景顏色的目的:

cs.lpszClass="style test"; //修改光標和背景

也可以通過以下方式實現(xiàn):

cs.lpszClass=AfxRegisterWndClass(NULL,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0);

 

注:所以在CMainFrame類中只能修改的是Icon

隨意如果采用這種代碼實現(xiàn),編寫的代碼較多,,會比較麻煩,,有一種替代的方法:

cs.lpszClass=AfxRegisterWndClass(NULL,0,0,LoadIcon(NULL,IDI_WARNING));

 

2.      在窗口創(chuàng)建之后修改窗口的外觀:

窗口創(chuàng)建之后修改窗口外觀一般在CMainFrame類的OnCreate函數(shù)中

SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW); //文檔的標題也去掉了

 

下面一種實現(xiàn)是從現(xiàn)有的窗口風格中去除某一種屬性:

LONG currentStyle=GetWindowLong(m_hWnd,GWL_STYLE); //得到現(xiàn)有窗口的風格

SetWindowLong(m_hWnd,GWL_STYLE,currentStyle & ~WS_MAXIMIZEBOX ); 去除了最大化框

 

//在創(chuàng)建窗口后修改圖標

SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_WARNING));

 

//在創(chuàng)建窗口后修改光標和背景(注:以下代碼在CViewOnCreate函數(shù)中實現(xiàn):)

SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH)); //設置背景顏色

SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_CROSS)); //設置光標

 

3.      加載外部導入的圖標:

LoadIcon如果加載的是系統(tǒng)圖標,則第一個參數(shù)是null,,但如果是自己的圖標,,則必須取得實例句柄。MAKEINTRESOURCE宏將資源號轉(zhuǎn)換為字符指針類型

HICON m_hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

 

      //theApp在別的cpp文件中定義,,則必須在本cpp中進行extern CStyleApp theApp聲明

HICON m_hIcon=LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));

 

HICON m_hIcon=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));

 

4.      工具欄:

給欄上的圖標間加上分隔符:按住鼠標左鍵拖動分隔符后的圖標一小段距離即可,。

刪除欄上的圖標:將指定圖標拖出工具欄即可。

創(chuàng)建工具欄:MSDN說明中提供兩種方法

Visual C++ provides you with two methods to create a toolbar. To create a toolbar resource using the Resource Editor, follow these steps:

  1. Create a toolbar resource.
  2. Construct the CToolBar object.
  3. Call the Create (or CreateEx) function to create the Windows toolbar and attach it to the CToolBar object.
  4. Call LoadToolBar to load the toolbar resource.

//創(chuàng)建自己的工具欄,,具體的創(chuàng)建過程參看MSDN中的CToolBar部分,以下代碼模仿向?qū)ё詣觿?chuàng)建的toolbar(代碼也是在CMainFrame類的OnCreate函數(shù)中)

首先創(chuàng)建ToolBar的資源m_newToolBar

//以下代碼放在CMainFrame類的OnCreate函數(shù)中:

if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_LEFT| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_newToolBar.LoadToolBar(IDR_TOOLBAR1))

      {

           TRACE0("Failed to create toolbar\n");

            return -1;      // fail to create

      }

      m_newToolBar.EnableDocking(CBRS_ALIGN_ANY); //使新的toolbar可???/span>

EnableDocking(CBRS_ALIGN_ANY); //使MainFrame可???,因為此段代碼已經(jīng)有了,所以省去

DockControlBar(&m_newToolBar); //是新的toolbar??吭?/span>MainFrame

 

Otherwise, follow these steps:

  1. Construct the CToolBar object.
  2. Call the Create (or CreateEx) function to create the Windows toolbar and attach it to the CToolBar object.
  3. Call LoadBitmap to load the bitmap that contains the toolbar button images.
  4. Call SetButtons to set the button style and associate each button with an image in the bitmap.

 

顯示和隱藏工具欄:

//第一種方法:

      if(m_newToolBar.IsWindowVisible()) //工具欄也是一個窗口

      {

           m_newToolBar.ShowWindow(SW_HIDE);

      }

      else

      {

           m_newToolBar.ShowWindow(SW_SHOW);

      }

      RecalcLayout(TRUE); //整個工具欄所在的控制欄顯示或消失

      DockControlBar(&m_newToolBar); //將新的toolbar??吭?/span>MainFrame

     

      //第二種方法,,這種方法是最好的,一行代碼實現(xiàn)了上面的功能

ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);

 

5.      狀態(tài)欄:

向?qū)?chuàng)建狀態(tài)欄是在CMainFrame類的OnCreate函數(shù)中實現(xiàn)的,,代碼如下:

if (!m_wndStatusBar.Create(this) ||                               !m_wndStatusBar.SetIndicators(indicators,  //indicators

             sizeof(indicators)/sizeof(UINT)))

      {

           TRACE0("Failed to create status bar\n");

           return -1;      // fail to create

}
其中indicators是一個指示器數(shù)組,,它在CMainFrame的源文件中定義:

static UINT indicators[] =

{

      //以下這些資源在string table中定義

      ID_SEPARATOR,           // status line indicator

 

      IDS_TIMER,  //自定義

      IDS_PROGRESS, //自定義

     

      ID_INDICATOR_CAPS,

      ID_INDICATOR_NUM,

      ID_INDICATOR_SCRL,

};

該指示器表示了在狀態(tài)欄中顯示的許多小面板

 

以下代碼實現(xiàn)在狀態(tài)欄上顯示當前時間(該函數(shù)也是在OnCreate函數(shù)中實現(xiàn)):

CTime currentTime=CTime::GetCurrentTime();

      CString strTime=currentTime.Format("%Y-%m-%d %H:%M:%S");

      CClientDC dc(this);

      CSize size=dc.GetTextExtent(strTime);

int idx=m_wndStatusBar.CommandToIndex(IDS_TIMER); //在不知道索引的前提下

//SetPaneInfo函數(shù)是設置面板的stylesize

m_wndStatusBar.SetPaneInfo(idx,IDS_TIMER,SBPS_NORMAL,size.cx); //使寬度合適

      //SetPaneText函數(shù)是在指定的面板上顯示內(nèi)容

m_wndStatusBar.SetPaneText(idx,strTime);

 

6.      進度欄:

創(chuàng)建類的成員函數(shù):CProgressCtrl m_progress;

創(chuàng)建水平進度條

m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,CRect(100,100,200,120),this,IDS_PROGRESS);

      垂直進度條

m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,CRect(100,100,120,220),this,IDS_PROGRESS);

      m_progress.SetRange(0,100); //設置范圍

m_progress.SetStep(10); //設置步進長度

 

將創(chuàng)建的進度欄放在狀態(tài)欄的指定編號的面板上(以下代碼放在OnPaint函數(shù)中):

CRect rect;

      m_wndStatusBar.GetItemRect(2,&rect); //得到狀態(tài)欄上指定面板的矩形大小

      if(!m_progress.m_hWnd)

      m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,IDS_PROGRESS);

      else

           m_progress.MoveWindow(rect); //如果已經(jīng)創(chuàng)建,,則只需要將進度條移動到指定矩形框內(nèi)

      m_progress.SetRange(0,100);

m_progress.SetStep(10);

注:上述代碼沒有放在CMainFrame類的OnCreate函數(shù)中是因為OnCreate函數(shù)創(chuàng)建好的時候窗口上的控件還沒有創(chuàng)建好,,所以想得到狀態(tài)欄上指定面板的矩形大小時候,會取不到值(可以想象成狀態(tài)欄也是窗口上的一個控件),。

 

將鼠標在視圖上移動時對應的x,,y坐標時時顯示在狀態(tài)欄上

CView類的OnMouseMove函數(shù)中添加:

CString location;

      location.Format("x=%d,y=%d",point.x,point.y);

      方法1

((CMainFrame*)GetParent())->m_wndStatusBar.SetPaneText(0,location,TRUE);

      方法2

SetMessageTextMSDN中的解釋是這樣的:Call this function to place a string in the status-bar pane that has an ID of 0. This is typically the leftmost, and longest, pane of the status bar.

      ((CMainFrame*)GetParent())->SetMessageText(location);

      方法3

GetMessageBarMSDN中解釋:Call this member function to get a pointer to the status bar.

((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(location);

 

7.      為程序添加啟動畫面:

Project->Add To Project->Components and Controls->Visual C++ component->Splash screen

修改啟動畫面的等待時間,其中在函數(shù)OnCreate函數(shù)有設置:SetTimer(1, 1000, NULL);

利用上述的向?qū)ё詣犹砑恿艘粋€新類,,CSplashWnd,,并且自動在CMainFrame類中的OnCreate函數(shù)中添加了CSplashWnd::ShowSplashScreen(this),也就是將啟動畫面添加到了運行程序框架類中了,。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多