在這里開始書寫日記、心
1、登陸菜單============================================================
m_hMenu = ::LoadMenu(hInstResource, MAKEINTRESOURCE(nMenu));//得到HMENU
CMenu mnu; mnu.Attach( m_hMenu );
CMenu mnu; mnu.LoadMenu(nMenu);
CMenu* pMenu = CMenu::FromHandle(m_hMenu );
CMenu *menu,*popup;
menu=new CMenu();
menu->LoadMenu(IDR_MENU1);
popup=menu->GetSubMenu(0);
===========================================================================
得到應(yīng)用程序路徑
CString m_strPath;
GetModuleFileName(NULL,m_strPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
m_strPath.ReleaseBuffer();
2、響應(yīng)鍵盤鼠標(biāo)輸入等==================================================
void CYourDlg::PreTranslateMessage(MSG* pMsg)
{
if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)
{
if(pMsg->message==WM_KEYDOWN)
{
int iID = ::GetDlgCtrlID(hWnd);
if(iID == IDC_EDIT_INPUT)
{
if(pMsg->wParam==13)//回車
{
}
}
}
}
}
3、編輯框拉到最下面===================================================
CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT_SEND);
pEdit->SendMessage(WM_VSCROLL, SB_BOTTOM);
PostMessage(WM_VSCROLL, SB_BOTTOM);
==========================================================================================
4、我要實現(xiàn)OnButton()用記事本打開文本文件,該用什么類函數(shù).如何實現(xiàn)============================
ShellExecute(this->m_hWnd,"open","notepad.exe","c:\\MyLog.txt","",SW_SHOW );
==========================================================================================
5、應(yīng)用程序退出函數(shù)
PostQuitMessage(0);
==========================================================================================
6、設(shè)置當(dāng)前窗口函數(shù)(主窗口函數(shù)里面)
SetForegroundWindow();
===========================================================================================
7、得到活動視圖
CMainFrame *pMainFrame = (CMainFrame *)AfxGetMainWnd();
CMy7View* pView=(CMy7View*)pMainFrame->GetActiveView();
===========================================================================================
8、得到應(yīng)用程序指針和打開文件
CLinkmestApp* pApp=(CLinkmestApp*) AfxGetApp();
pApp->OpenDocumentFile(infilename);
===========================================================================================
9、靜態(tài)成員函數(shù)沒有this,也就沒有m_hWnd,因此出錯。
使用AfxMessageBox
===========================================================================================
10、在DLL模塊中調(diào)用GetModuleHandle(NULL)返回哪個模塊的句柄,exe還是dll?
exe!If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process.
===========================================================================================
11、如何將CString類型轉(zhuǎn)化為float類型啊,急死了,幫忙啊.
CString a="32.2";
float b = atof(a);
===========================================================================================
12、窗口句柄
HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
===========================================================================================
13、模式和無模式對話的中止是不一樣的:
模式對話通過調(diào)用CDialog : : EndDialog 來中止,無模式對話則是調(diào)用
CWnd: : DestroyWindow來中止的,
===========================================================================================
14、動態(tài)創(chuàng)建的edit沒有邊框的問題
m_edit.Create(....);
m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);
===========================================================================================
15、改變richedit指定區(qū)域的顏色及字體
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |
CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
cf.dwEffects = 0;
cf.yHeight = 12*12;//文字高度
cf.crTextColor = RGB(200, 100, 255); //文字顏色
strcpy(cf.szFaceName ,_T("隸書"));//設(shè)置字體
m_richedit1.SetSel(1, 5); //設(shè)置處理區(qū)域
m_richedit1.SetSelectionCharFormat(cf);
===========================================================================================
16、隨輸入自動滾動到最后一行(richedit同樣適用)
方法一:(摘自msdn)
// The pointer to my edit.
extern CEdit* pmyEdit;
int nFirstVisible = pmyEdit->GetFirstVisibleLine();
// Scroll the edit control so that the first visible line
// is the first line of text.
if (nFirstVisible > 0)
{
pmyEdit->LineScroll(-nFirstVisible, 0);
}
方法二:
m_richedit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);
===========================================================================================
17、在edit最后添加字符串
CString str;
m_edit1.SetSel(-1, -1); //在指定位置nLength處追加 m_edit.SetSel(nLength, nLength);
m_edit1.ReplaceSel(str);
===========================================================================================
18、判斷edit中光標(biāo)狀態(tài)并得到選中內(nèi)容(richedit同樣適用)
int nStart, nEnd;
CString strTemp;
m_edit1.GetSel(nStart, nEnd);
if(nStart == nEnd)
{
strTemp.Format(_T("光標(biāo)在%d"), nStart);
AfxMessageBox(strTemp);
}
else
{
//得到edit選中的內(nèi)容
m_edit1.GetWindowText(strTemp);
strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);
AfxMessageBox(strTemp);
}
注:GetSel后,如果nStart和nEnd,表明光標(biāo)處于某個位置(直觀來看就是光標(biāo)在閃動);
如果nStart和nEnd不相等,表明用戶在edit中選中了一段內(nèi)容。
===========================================================================================
19、設(shè)置edit只讀屬性
方法一:
m_edit1.SetReadOnly(TRUE);
方法二:
::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);
方法三: 在屬性中直接選中!
===========================================================================================
20、如何限制edit輸入指定字符
可以從CEdit派生一個類,添加WM_CHAR消息映射。下面一個例子實現(xiàn)了限定輸入16進制字符的功能。
void CMyHexEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if ( (nChar >= '0' && nChar <= '9') ||
(nChar >= 'a' && nChar <= 'f') ||
(nChar >= 'A' && nChar <= 'F') ||
nChar == VK_BACK ||
nChar == VK_DELETE) //msdn的virtual key
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
}
==========================================================================================
21、對話框的背景貼上一張圖
1.在對話框頭文件件定義CBrush m_brBk;
2.HBRUSH CxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if (pWnd == this)
{
return m_brBk;
}
}
3.BOOL CxxDlg::OnInitDialog()
{
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
m_brBk.CreatePatternBrush(&bmp);
bmp.DeleteObject();
}
=========================================================================================
22、在TreeList中使用Edit功能
首先TreeList應(yīng)該使用TVS_EDITLABELS風(fēng)格,可以在創(chuàng)建資源時指定,或者在使用Create時指定,或者在PreCreateWindos()中改變。
接下來需要處理TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT消息。
void CXXXX::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// Limit text length
GetEditControl()->LimitText(127);
*pResult = 0;
}
如果不處理 TVN_ENDLABELEDIT 消息,則文本的更改不會生效。
void COutline::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
GetEditControl()->GetWindowText(s);
// Set result to TRUE to accept the changes
*pResult = TRUE;
}
=========================================================================================
23、如何動態(tài)改變Picture控件里的圖片
HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, "這里是你的*.bmp圖片位置(如: D:\\VC\\1.bmp)", IMAGE_BITMAP, 0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);((CStatic *)GetDlgItem(Picture控件ID))->SetBitmap(hBitmap);
=========================================================================================
24、關(guān)于在CButton上貼位圖的問題
方法一:
首先,你得選中按鈕的owner Draw屬性,在資源中加載兩副*.bmp格式的位圖,然后在你的對話框類中加入:
CBitmapButton m_btnX1;//必須放在函數(shù)外面才能正常實現(xiàn)
BOOL CXXXXXXX::OnInitDialog()
{
CDialog::OnInitDialog();
m_btnX1.LoadBitmaps(IDB_XXXX_UP,IDB_XXXX_DOWN);//這里是兩副位圖,鼠標(biāo)按下和彈起,
// 也可以只加一個ID資源;
m_btnX1.SubclassDlgItem(IDC_DASEN_X1,this);
m_btnX1.SizeToContent();
}
方法二:
首先要在資源編輯器的按鈕屬性對話框中設(shè)置按鈕的bitmap屬性為TRUE
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)Bitmap.Detach();
CButton *pButton=(CButton*)GetDlgItem(IDC_BUTTON2);
pButton->SetBitmap(hBitmap);
關(guān)于在CButton上貼icon圖標(biāo)的問題
首先要在資源編輯器的按鈕屬性對話框中設(shè)置按鈕的Icon屬性為TRUE
HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
CButton *pButton=(CButton*)GetDlgItem(IDC_BUTTON1);
pButton->SetIcon(hIcon);
=========================================================================================
25、如何動態(tài)獲取工具條指針并給工具條加標(biāo)題?
[問題提出]
工具條也是窗口,是窗口就有標(biāo)題,如何給工具條加標(biāo)題?
[程序?qū)崿F(xiàn)]
不想動態(tài)改變工具條的標(biāo)題就在CMainFrame::OnCreate()中:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
m_wndToolBar.SetWindowText(_T("Standdard"));
return 0;
}
若想動態(tài)改變工具條的標(biāo)題,如下:
聲明一個菜單,并響應(yīng)事件,如響應(yīng):OnMyToolBar()函數(shù)
void CMainFrame::OnMyToolBar()
{
// TODO: Add your command handler code here
CToolBar * pToolBar =(CToolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
pToolBar->SetWindowText (_T("Standdard"));
}
不要在TooBar懸浮時做OnMyToolBar()會出錯的.
順便提一下如何獲得狀態(tài)條的指針:
CStatusBar * pStatusBar =(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow (AFX_IDW_STATUS_BAR);
========================================================================================
26、為什么即使調(diào)用EnableMenuItem菜單項后,菜單項還處于禁止?fàn)顟B(tài)?
[問題提出]
在單文檔工程中,編輯->撤銷菜單選項是灰色不可用狀態(tài),如何使他不灰化?使用EnableMenuItem (ID_EDIT_UNDO,MF_BYCOMMAND | MF_ENABLED);不好使.
[解決方法]
在MainFrame中有個m_bAutoMenuEnable成員變量,默認(rèn)是TRUE,要把它FALSE了,就好使了.
[程序?qū)崿F(xiàn)]
在你的工程建立一個菜單,建立響應(yīng)的函數(shù)如:OnYourOperate().
void CMainFrame::OnYourOperate()
{
// TODO: Add your command handler code here
CMenu* pMenu=GetMenu ();
m_bAutoMenuEnable=FALSE;
ASSERT_VALID (pMenu);
pMenu->EnableMenuItem (ID_EDIT_UNDO,MF_BYCOMMAND | MF_ENABLED);
}
編譯運行,不要做其他操作,先試試點你的菜單后編輯->撤銷是否不灰化了.
試試去掉m_bAutoMenuEnable=FALSE;操作一下.
========================================================================================
27、如何在編輯控件中以追加的方式添入字符?
[問題提出]
SetDlgItemText可以向Edit控件中輸入字符,發(fā)送更新的消息也可是Edit控件顯示與其關(guān)聯(lián)的變量的值, 但若是向已有的Edit字符后追加字符,該如何做?
[程序?qū)崿F(xiàn)]
建立名為My的對話框工程,添加一個Edit和一個Button控件.Edit的ID=IDC_EDIT1,Button的 ID=IDC_BUTTON1.建立和IDC_BUTTON1的響應(yīng)函數(shù):OnButton1()
void CMyDlg::OnButton1()
{
CString pText="你好";
CEdit *m_Edit=(CEdit *)GetDlgItem(IDC_EDIT1);
int nLen=m_Edit->GetWindowTextLength();
m_Edit->SetFocus();
m_Edit->SetSel(nLen, nLen);
m_Edit->ReplaceSel(pText);
}
在Edit控件中輸入字符,想追加時按IDC_BUTTON1按鈕.
========================================================================================
28、為基于MFC的對話框添加ToolTip的簡單方法
此方法適用于MFC派生類,在基于對話框的類中測試通過。具體步驟如下:
1、選擇“Project”菜單,然后“Set Active Project” 。
2、選擇“Project”菜單 -->“Add to Project” -->“Components and Controls” -->“VC++ Components” --> “ToolTip Support”
3、選擇“Insert”
4、在對話框資源中加入一個按鈕,ID為IDC_ToolTip
5、在 CDialog::OnInitDialog() 中找到下面的注釋行:
// TODO: Use one of the following forms to add controls:
// m_tooltip.AddTool(GetDlgItem(IDC_), );
// m_tooltip.AddTool(GetDlgItem(IDC_), "");
然后在注釋行后加入一行代碼:
m_tooltip.AddTool(GetDlgItem(IDC_ToolTip), "顯示 ToolTip");
經(jīng)過上面的步驟之后:
頭文件(*.h)中會自動加入下面的代碼:
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
實現(xiàn)文件(*.cpp)會加入方法實現(xiàn):
PreTranslateMessage(MSG* pMsg);
編譯程序執(zhí)行吧,將鼠標(biāo)指針移到ToolTip按鈕上就會顯示出一個ToolTip信息。
========================================================================================
29、在程序進行中不響應(yīng)ESC,Enter鍵應(yīng)該怎么做?
[問題提出]
對話框程序ESC和ENTER健會導(dǎo)致程序退出,在程序進行中不響應(yīng)ESC,Enter鍵應(yīng)該怎么做?
[問題解答]
方法1:重載CDialog::OnOK();
方法2:
BOOL CCXXX::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_RETURN://屏蔽回車
return TRUE;
case VK_ESCAPE://屏蔽Esc
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
========================================================================================
30、讓應(yīng)用程序有啟動畫面
在應(yīng)用程序中,從Project 菜單中選擇AddToProject,并單擊位于次級菜單上的Components andControls...,選擇Splashscreen組件,如圖1所示,單擊Insert。 接受所有的默認(rèn)設(shè)置。
========================================================================================
31、如何處理自定義消息
ClassWizard不允許增加用戶自定義消息,所以你必須手工輸入。輸入后,ClassWizard就可以象處理其 它消息一樣處理你自定義的消息了。
下面是增加自定義消息的步驟:
第一步:定義消息。開發(fā)Windows應(yīng)用程序時,Microsoft推薦用戶自定義消息至少是WM_USER+100,因 為很多新控件也要使用WM_USER消息。#define MYWM_MESSAGE WM_USER+100 #define WM_MY_MESSAGE (WM_USER+100),
第二步:實現(xiàn)消息處理函數(shù)。該函數(shù)使用WPRAM和LPARAM參數(shù)并返回LPESULT。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 處理用戶自定義消息
...
return 0;
}
第三步:在類頭文件的AFX_MSG塊中說明消息處理函數(shù):
class CMainFrame:public CMDIFrameWnd
{
...
// 一般消息映射函數(shù)
protected:
// {{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
第四步:在用戶類的消息塊中,使用ON_MESSAGE宏指令將消息映射到消息處理函數(shù)中。
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
如果用戶需要一個整個系統(tǒng)唯一的消息,可以調(diào)用SDK函數(shù)RegisterWindowMessage并使用 ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步驟同上。
========================================================================================
32、在對話框中的控件中顯示自的光標(biāo)定義
BOOL CButtonDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
HWND hWnd = ::GetFocus();
int iID = ::GetDlgCtrlID(hWnd);
(GetDlgItem(IDC_EDIT1))->m_hWnd;
if(iID == IDC_EDIT1)
{
::HideCaret(hWnd);
::SetCursor(::LoadCursor(NULL,IDC_HELP));
}
return CDialog::PreTranslateMessage(pMsg);
}情