在这里开始书写日记、心
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);
===========================================================================
得到应用程序路径
CString m_strPath;
GetModuleFileName(NULL,m_strPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
m_strPath.ReleaseBuffer();
2、响应键盘鼠标输入等==================================================
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、我要实现OnButton()用记事本打开文本文件,该用什么类函数.如何实现============================
ShellExecute(this->m_hWnd,"open","notepad.exe","c:\\MyLog.txt","",SW_SHOW );
==========================================================================================
5、应用程序退出函数
PostQuitMessage(0);
==========================================================================================
6、设置当前窗口函数(主窗口函数里面)
SetForegroundWindow();
===========================================================================================
7、得到活动视图
CMainFrame *pMainFrame = (CMainFrame *)AfxGetMainWnd();
CMy7View* pView=(CMy7View*)pMainFrame->GetActiveView();
===========================================================================================
8、得到应用程序指针和打开文件
CLinkmestApp* pApp=(CLinkmestApp*) AfxGetApp();
pApp->OpenDocumentFile(infilename);
===========================================================================================
9、静态成员函数没有this,也就没有m_hWnd,因此出错。
使用AfxMessageBox
===========================================================================================
10、在DLL模块中调用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类型转化为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、模式和无模式对话的中止是不一样的:
模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用
CWnd: : DestroyWindow来中止的,
===========================================================================================
14、动态创建的edit没有边框的问题
m_edit.Create(....);
m_edit.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_DRAWFRAME);
===========================================================================================
15、改变richedit指定区域的颜色及字体
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("隶书"));//设置字体
m_richedit1.SetSel(1, 5); //设置处理区域
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中光标状态并得到选中内容(richedit同样适用)
int nStart, nEnd;
CString strTemp;
m_edit1.GetSel(nStart, nEnd);
if(nStart == nEnd)
{
strTemp.Format(_T("光标在%d"), nStart);
AfxMessageBox(strTemp);
}
else
{
//得到edit选中的内容
m_edit1.GetWindowText(strTemp);
strTemp = strTemp.Mid(nStart) - strTemp.Mid(nEnd);
AfxMessageBox(strTemp);
}
注:GetSel后,如果nStart和nEnd,表明光标处于某个位置(直观来看就是光标在闪动);
如果nStart和nEnd不相等,表明用户在edit中选中了一段内容。
===========================================================================================
19、设置edit只读属性
方法一:
m_edit1.SetReadOnly(TRUE);
方法二:
::SendMessage(m_edit1.m_hWnd, EM_SETREADONLY, TRUE, 0);
方法三: 在属性中直接选中!
===========================================================================================
20、如何限制edit输入指定字符
可以从CEdit派生一个类,添加WM_CHAR消息映射。下面一个例子实现了限定输入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应该使用TVS_EDITLABELS风格,可以在创建资源时指定,或者在使用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、如何动态改变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、关于在CButton上贴位图的问题
方法一:
首先,你得选中按钮的owner Draw属性,在资源中加载两副*.bmp格式的位图,然后在你的对话框类中加入:
CBitmapButton m_btnX1;//必须放在函数外面才能正常实现
BOOL CXXXXXXX::OnInitDialog()
{
CDialog::OnInitDialog();
m_btnX1.LoadBitmaps(IDB_XXXX_UP,IDB_XXXX_DOWN);//这里是两副位图,鼠标按下和弹起,
// 也可以只加一个ID资源;
m_btnX1.SubclassDlgItem(IDC_DASEN_X1,this);
m_btnX1.SizeToContent();
}
方法二:
首先要在资源编辑器的按钮属性对话框中设置按钮的bitmap属性为TRUE
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
HBITMAP hBitmap = (HBITMAP)Bitmap.Detach();
CButton *pButton=(CButton*)GetDlgItem(IDC_BUTTON2);
pButton->SetBitmap(hBitmap);
关于在CButton上贴icon图标的问题
首先要在资源编辑器的按钮属性对话框中设置按钮的Icon属性为TRUE
HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
CButton *pButton=(CButton*)GetDlgItem(IDC_BUTTON1);
pButton->SetIcon(hIcon);
=========================================================================================
25、如何动态获取工具条指针并给工具条加标题?
[问题提出]
工具条也是窗口,是窗口就有标题,如何给工具条加标题?
[程序实现]
不想动态改变工具条的标题就在CMainFrame::OnCreate()中:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
m_wndToolBar.SetWindowText(_T("Standdard"));
return 0;
}
若想动态改变工具条的标题,如下:
声明一个菜单,并响应事件,如响应:OnMyToolBar()函数
void CMainFrame::OnMyToolBar()
{
// TODO: Add your command handler code here
CToolBar * pToolBar =(CToolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
pToolBar->SetWindowText (_T("Standdard"));
}
不要在TooBar悬浮时做OnMyToolBar()会出错的.
顺便提一下如何获得状态条的指针:
CStatusBar * pStatusBar =(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow (AFX_IDW_STATUS_BAR);
========================================================================================
26、为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态?
[问题提出]
在单文档工程中,编辑->撤销菜单选项是灰色不可用状态,如何使他不灰化?使用EnableMenuItem (ID_EDIT_UNDO,MF_BYCOMMAND | MF_ENABLED);不好使.
[解决方法]
在MainFrame中有个m_bAutoMenuEnable成员变量,默认是TRUE,要把它FALSE了,就好使了.
[程序实现]
在你的工程建立一个菜单,建立响应的函数如: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控件中输入字符,发送更新的消息也可是Edit控件显示与其关联的变量的值, 但若是向已有的Edit字符后追加字符,该如何做?
[程序实现]
建立名为My的对话框工程,添加一个Edit和一个Button控件.Edit的ID=IDC_EDIT1,Button的 ID=IDC_BUTTON1.建立和IDC_BUTTON1的响应函数: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");
经过上面的步骤之后:
头文件(*.h)中会自动加入下面的代码:
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
实现文件(*.cpp)会加入方法实现:
PreTranslateMessage(MSG* pMsg);
编译程序执行吧,将鼠标指针移到ToolTip按钮上就会显示出一个ToolTip信息。
========================================================================================
29、在程序进行中不响应ESC,Enter键应该怎么做?
[问题提出]
对话框程序ESC和ENTER健会导致程序退出,在程序进行中不响应ESC,Enter键应该怎么做?
[问题解答]
方法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、让应用程序有启动画面
在应用程序中,从Project 菜单中选择AddToProject,并单击位于次级菜单上的Components andControls...,选择Splashscreen组件,如图1所示,单击Insert。 接受所有的默认设置。
========================================================================================
31、如何处理自定义消息
ClassWizard不允许增加用户自定义消息,所以你必须手工输入。输入后,ClassWizard就可以象处理其 它消息一样处理你自定义的消息了。
下面是增加自定义消息的步骤:
第一步:定义消息。开发Windows应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因 为很多新控件也要使用WM_USER消息。#define MYWM_MESSAGE WM_USER+100 #define WM_MY_MESSAGE (WM_USER+100),
第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
...
return 0;
}
第三步:在类头文件的AFX_MSG块中说明消息处理函数:
class CMainFrame:public CMDIFrameWnd
{
...
// 一般消息映射函数
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宏指令将消息映射到消息处理函数中。
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()
如果用户需要一个整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用 ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。
========================================================================================
32、在对话框中的控件中显示自的光标定义
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);
}情