天天看點

對話框相關(繼續添加中)

一、在對話框中使用菜單

方法1:

先在資源編輯器裡制作好菜單,假設ID為IDR_MENU1,然後打開對話框的屬性視窗,在Dialog屬性裡的General中選擇你的Menu菜單的ID就行了

方法2:

CMenu menu;           menu.LoadMenu(IDR_MENU1);       SetMenu(&menu);

方法3:

HMENU hMenu = LoadMenu(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU1));

::SetMenu(m_hWnd,hMenu);

方法4:動态建立:

CMenu menu,subMenu;

VERIFY(menu.CreateMenu());

VERIFY(subMenu.CreatePopupMenu());

subMenu.AppendMenu(MF_STRING,ID_11,(LPCTSTR)"11");

subMenu.InsertMenu(0,MF_BYCOMMAND,ID_12,(LPCTSTR)"12");

menu.AppendMenu(MF_POPUP,(UINT)subMenu.m_hMenu,"&MyMenu");

SetMenu(&menu);

二、改變對話框背景色

方法1:.h中:CBrush m_Brush;                  .cpp中:在OnInitDialog()中:   m_Brush.CreateSolidBrush(RGB(0,128,128)); OnCtlColor中: return m_Brush;

方法2:在CXXApp::InitInstance()中dlg.DoModal()前 SetDialogBkColor(RGB(0,255,0),RGB(255,0,0));

三、為對話框中的控件加上提示資訊

方法1:在XXdlg.h中:CToolTipCtrl m_TipCtrl;

在XXDlg.cpp中:在OnInitDialog()中:

CButton *pButton = NULL;

pButton = (CButton *)GetDlgItem(IDC_BUTTON1);

m_TipCtrl.Create(this);

m_TipCtrl.AddTool(pButton,"This is a button");

CEdit *pEdit = NULL;

pEdit = (CEdit *)GetDlgItem(IDC_EDIT1);

m_TipCtrl.AddTool(pEdit,"This is an edit box");

在PreTranslateMessage中:

switch (pMsg->message)

{

case WM_LBUTTONDOWN:

case WM_LBUTTONUP:

case WM_MOUSEMOVE:

           m_TipCtrl.RelayEvent(pMsg);

           break;

}

方法2:project->Add to Project->component and control->VC++ component->Tooltip support

         在OnInitDialog中加入,m_tooltip.AddTool(GetDlgItem(IDC_),”ToolTip”);

四、如何使對話框上的關閉按鈕失效

方法1:重載WM_CLOSE,登出掉CDialog::OnClose()

方法2:通過CWnd::GetSystemMenu得到句柄,再通過CMenu::ModifyMenu或CMenu::EnableMenuItem()函數改變系統菜單的屬性,在OnInitDialog中:      CMenu *pMenu = this->GetSystemMenu(FALSE);

pMenu->ModifyMenu(SC_CLOSE,MF_BYCOMMAND | MF_GRAYED);

或者:

CMenu *pMenu = this->GetSystemMenu(FALSE);

pMenu->EnableMenuItem(SC_CLOSE,MF_BYCOMMAND | MF_GRAYED);

五、如何改變對話框内控件的字型

CEdit *pEdit = NULL;

pEdit = (CEdit *)GetDlgItem(IDC_EDIT1);

m_TipCtrl.AddTool(pEdit,"This is an edit box");

m_Font.CreateFont(14,0,0,0,100,TRUE,TRUE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,

           CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,"隸書");

pEdit->SetFont(&m_Font,FALSE);

六、如何屏蔽Enter鍵與ESC鍵

方法1:重載OnOK(),注釋掉CDialog::OnOK();

方法2:PreTranslateMessage: if (pMsg->message==WM_KEYDOWN)

{

           switch (pMsg->wParam)

{

case VK_RETURN:  case VK_ESCAPE:  return TRUE;

}

}

七、在對話框上顯示Bmp圖檔

a、   class CAboutDlg内:CBitmap *m_pBmp;

b、   構造函數中:m_pBmp = NULL;

c、   OnInitDialog中:        HBITMAP hBmp = (HBITMAP)::LoadImage(0,"f://1.bmp",IMAGE_BITMAP,0,0,

LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);

                                       _ASSERT(hBmp);

                                      m_pBmp = CBitmap::FromHandle(hBmp);

d、   OnPaint中:         BITMAP bm;

     CDC memDC;

     VERIFY(m_pBmp->GetObject(sizeof(bm),(LPVOID)&bm));

     memDC.CreateCompatibleDC(&dc);

     CBitmap *pOldBmp = (CBitmap *)memDC.SelectObject(m_pBmp);

     BitBlt(dc.m_hDC,0,0,bm.bmWidth,bm.bmHeight,memDC.m_hDC,0,0,SRCCOPY);

     memDC.SelectObject(pOldBmp);

八、如何在不使用通用檔案打開對話框的情況下顯示一個檔案清單

TCHAR szPath[MAX_PATH] = {"C:"};

//在ListBox中顯示

DlgDirList(szPath,IDC_LIST2,NULL,DDL_DIRECTORY);

//在combo box中顯示

this->DlgDirListComboBox(szPath,IDC_COMBO1,NULL,DDL_READWRITE | DDL_READONLY | DDL_HIDDEN | DDL_SYSTEM | DDL_ARCHIVE | DDL_DIRECTORY | DDL_DRIVES);

九、如何讓對話框在什麼樣不顯示

DWORD dwStyle = ::GetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE);

dwStyle = WS_EX_TOOLWINDOW;

AfxGetMainWnd()->ShowWindow(SW_HIDE);

::SetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE,dwStyle);

十、如何讓Static控件響應WM_MOUSEMOVE消息

                    CRect rect;

                   m_Static.GetWindowRect(&rect);

                    ScreenToClient(&rect);

                   if (rect.PtInRect(point))      {        MessageBox("In");    }

十一、為對話框中加入工具條

m_ToolBar.Create(this,WS_CHILD | WS_VISIBLE |CBRS_TOP|CBRS_TOOLTIPS |CBRS_FLYBY | CBRS_BORDER_BOTTOM);

m_ToolBar.LoadToolBar(IDR_TOOLBAR1);

CRect rcClientStart,rcClientNow;

GetClientRect(rcClientStart);

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNow);

CPoint ptOffset(rcClientNow.left-rcClientStart.left,rcClientNow.top-rcClientStart.top);

CRect rcChild;

CWnd *pWndChild = GetWindow(GW_CHILD);

while (pWndChild)

{

    pWndChild->GetWindowRect(rcChild);

    ScreenToClient(rcChild);

    rcChild.OffsetRect(ptOffset);

    pWndChild->MoveWindow(rcChild,TRUE);

    pWndChild = pWndChild->GetNextWindow();

}

CRect rcWindow;

GetWindowRect(rcWindow);

rcWindow.right+=rcClientStart.Width()-rcClientNow.Width();

rcWindow.bottom+=rcClientStart.Height()-rcClientNow.Height();

MoveWindow(rcWindow,TRUE);

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

十二、改變對話框形狀

可通過CreatePolygonRgn、CreateRectRgn、CreateRoundRectRgn 等函數來改變

CRgn m_rgn;

CRect rcDlg;

GetClientRect(rcDlg);

m_rgn.CreateEllipticRgn(0,0,rcDlg.Width(),rcDlg.Height());

SetWindowRgn((HRGN)m_rgn,FALSE);

十三、如何實作非客戶區移動

方法1:OnLButtonDown中:

            PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));

方法2:OnLButtonDown中:

            SendMessage(WM_SYSCOMMAND,0xF012,0);

方法3:OnNcHitTest中

                  UINT nHitTest = CDialog::OnNcHitTest(CSize(point.x,point.y));

      return (nHitTest==HTCLIENT) ? HTCAPTION:nHitTest;

十四、  在對話框中加入狀态條

在.h中加入CStatusBar m_StatusBar;

在.cpp中加入static UINT BASED_CODE indicators[] =

{

ID_INDICATOR_CAPS,

ID_INDICATOR_NUM

};

在OnInitDialog中加入:

m_StatusBar.CreateEx(this,SBT_TOOLTIPS);

m_StatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));

CRect rect;

GetClientRect(&rect);

m_StatusBar.SetPaneInfo(0,ID_INDICATOR_CAPS,SBPS_NORMAL,rect.Width()/2);

m_StatusBar.SetPaneInfo(1,ID_INDICATOR_NUM,SBPS_NORMAL,rect.Width()/2);

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,ID_INDICATOR_NUM);

m_StatusBar.GetStatusBarCtrl().SetBkColor(RGB(0,180,180));

十五、改變滑鼠指針

OnSetCursor中:

SetCursor(AfxGetApp()->LoadStandardCursor(IDC_UPARROW));

return 0;   

十六、加入上下文幫助

在OnInitDialog中

ModifyStyleEx(0,WS_EX_CONTEXTHELP);

在OnHelpInfo中:

short state = GetKeyState(VK_F1);

if (state<0)

{

     return CDialog::OnHelpInfo(pHelpInfo);

}

else

{

     if (pHelpInfo->dwContextId)

     {

         WinHelp(pHelpInfo->dwContextId,HELP_CONTEXTPOPUP);

     }

     return TRUE;

}

十七

靜态文本的透明處理

在對話框類中WM_CTLCOlOR 消息

HBRUSH CShadeBkDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

CFont m_font;

LOGFONT LogFnt={ //定義新的字型

20, //字型高度為30

14, //字型寬度為24

0, //文本不傾斜

0, //字型的粗細度

/* FW_HEAVY8*/0, //FW_HEAVY為最粗

0, //字型為斜體

0, //輸出時帶下劃線

0, //無删除線

ANSI_CHARSET, //所用字元集為ANSI_CHARSET

OUT_DEFAULT_PRECIS, //輸出精度為預設精度

CLIP_DEFAULT_PRECIS, //裁剪精度為預設精度

DEFAULT_QUALITY, //輸出品質為預設值

DEFAULT_PITCH, //字間距使用預設值

"Arial" //比對的字型

};

m_font.CreateFontIndirect(&LogFnt); //建立字型

// TODO: Change any attributes of the DC here

switch(nCtlColor)

{

case CTLCOLOR_STATIC:

pDC->SetBkMode(TRANSPARENT);

pDC->SetTextColor(RGB(0,0,255)); //字型顔色設定為藍色

pDC->SelectObject(&m_font);//設定字型

return(HBRUSH)GetStockObject(HOLLOW_BRUSH);

default:

return CDialog::OnCtlColor(pDC,pWnd,nCtlColor);

}

// TODO: Return a different brush if the default is not desired

return hbr;

}

為了友善 就把字型定義到這裡了 這個不是重點 主要是透明處理

十八:

對話框 bitmap圖檔背景 在OnPrint()中

else{

CPaintDC dc(this);

//CDialog::OnPaint();

CBitmap bmpBackground;

bmpBackground.LoadBitmap(IDB_BITMAP1);

CDC dcMem;

dcMem.CreateCompatibleDC(&dc);

dcMem.SelectObject(&bmpBackground);

CRect rect;

GetClientRect(&rect);

BITMAP bitmap;

bmpBackground.GetBitmap(&bitmap);

dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);

}