我系MFC中的菜鸟新人,现有一简单问题求助大家。我希望位图对“Ctrl+Alt+鼠标左键”点击发生响应,以打开另外一个对话框,应该如何去做?我对键盘响应用的是PreTranslateMessage,代码是这样的:
BOOL CTimeDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
if (GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_MENU))
keypress = true;
else
keypress = false;
}
if (pMsg->message == WM_KEYUP)
keypress = false;
}我对鼠标响应的代码是这样的:
void CTimeDlg::OnStnClickedBitmap()
{
if (keypress)
{
//打开另外一个对话框代码 }
}
但为什么不行呢?两者应该怎么联系起来呢?特别是鼠标响应那块,我试着看只响应鼠标点击怎么样,一点反应都没起有!
请教高手!
BOOL CTimeDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)
{
if (GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_MENU))
keypress = true;
else
keypress = false;
}
if (pMsg->message == WM_KEYUP)
keypress = false;
}我对鼠标响应的代码是这样的:
void CTimeDlg::OnStnClickedBitmap()
{
if (keypress)
{
//打开另外一个对话框代码 }
}
但为什么不行呢?两者应该怎么联系起来呢?特别是鼠标响应那块,我试着看只响应鼠标点击怎么样,一点反应都没起有!
请教高手!
解决方案 »
- PostMessage(WM_NCLBUTTONUP, HTCAPTION, lParam);//什么意思???
- ::GetDIBits 返回值为0。请各位指教下。
- 50分求一个组合的的的算法或程序~
- 能否推荐几个下载较好版本VC++6.0的地址??谢了!!
- 指定了Lib文件,仍然出现unresolved external symbol
- 如何才能让一个应用程序只能开启一个
- 求教:runtimes的含义.
- 急:用InstallShield调用vc++开发的Dll出现的数据类型不配的简单问题?
- 谁帮忙re一下这个贴子,把贴子结了散分!
- 请问有那位大虾知道哪里有TTCN的编辑器(高分!!!高分!!!)
- 点击工具栏上按钮,如何得到其所在工具栏句柄
- 新手问题:怎么样控制MFC项目和Win32项目中对话框风格
你是想点击了位图区域,然后do something??
如果是这样,你先判断鼠标位置是否在位图里..然后处理事件
“IDC_BITMAP”是我位图的ID。
这个是...?加在void CTimeDlg::OnStnClickedBitmap() 里面?
如果声明为全局变量的话又怎么让“OnStnClickedBitmap()”函数调用“PreTranslateMessage(MSG* pMsg)”函数中得到的“keypress”的值呢?
{
if ((GetAsyncKeyState(VK_CONTROL)<0) && (GetAsyncKeyState(VK_MENU))<0) )
{
//打开另外一个对话框代码 }
} 你确认点击位图OnStnClickedBitmap正确响应了吗?
如果只响应“Ctrl+Alt”的话,我试过都是OK的啊。
BOOL CDD::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN)
{
if (GetAsyncKeyState(VK_CONTROL)<0 && GetAsyncKeyState(VK_MENU)<0)
keypress = true;
else
keypress = false;
}
}void CDD::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(keypress)
{
CDialog2 dlg2;
dlg2.DoModal();
}
CDialog::OnLButtonDown(nFlags, point);
}
以确认OnStnClickedBitmap正常工作。
若位图ID是“IDC_STATIC”的话不是就不可以添加单击事件吗?
好像是这里出了问题,程式写成这样也没有反应:
void CTimeDlg::OnStnClickedBitmap()
{
MessageBox(NULL,TEXT(“HELLO”),0);
}这会是哪里出错了呢?
如何控制richedit2控件中文字的字体、颜色等?
就是一有文字输入控件,这文字就按照我设定的字体颜色显示?
你原来的思路很好,应该可以实现,加把力吧
设置选种文本的属性
我是這樣做的:
先在BOOL CTimeDlg::OnInitDialog()中添加“DispR.SetEventMask(ENM_CHANGE);” //"IDC_DispR"是我richedit2編輯框的ID然後在
void CTimeDlg::OnEnChangeDispR()
{
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);
}但卻有這個錯誤信息:
f:\times\timedlg.cpp(76) : error C2039: “SetEventMask”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC<char>
1> ]
1>f:\times\timedlg.cpp(459) : error C2039: “SetSel”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC<char>
1> ]
1>f:\times\timedlg.cpp(460) : error C2039: “SetSelectionCharFormat”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC<char>
1> ]这又是哪里出错了呢?
我是這樣做的:
先在BOOL CTimeDlg::OnInitDialog()中添加“DispR.SetEventMask(ENM_CHANGE);” //"IDC_DispR"是我richedit2編輯框的ID 然後在
void CTimeDlg::OnEnChangeDispR()
{
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);
} 但卻有這個錯誤信息:
f:\times\timedlg.cpp(76) : error C2039: “SetEventMask”: 不是“ATL::CStringT <BaseType,StringTraits>”的成员
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC <char>
1> ]
1>f:\times\timedlg.cpp(459) : error C2039: “SetSel”: 不是“ATL::CStringT <BaseType,StringTraits>”的成员
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC <char>
1> ]
1>f:\times\timedlg.cpp(460) : error C2039: “SetSelectionCharFormat”: 不是“ATL::CStringT <BaseType,StringTraits>”的成员
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC <char>
1> ] 这又是哪里出错了呢?
在CMyPicture::OnLButtonDown(UINT nFlags, CPoint point)中判断Ctrl+Alt是否按下就行了。
你好,能再将具体点吗?
你说的位图类型是属性中的“Type”吗?这个好像不能改?
//根据ID设置颜色颜色
if (pWnd->GetDlgCtrlID()==IDC_TIPINFO)
{
pDC->SetTextColor(RGB(0,100,0));
}
BOOL CDD::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN)
{
if (GetAsyncKeyState(VK_CONTROL)<0 && GetAsyncKeyState(VK_MENU)<0)
keypress = true;
else
keypress = false;
}
return CDialog::PreTranslateMessage(pMsg);
}void CDD::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(keypress)
{
CRect rect;
LPPOINT pt;
m_image.GetWindowRect(&rect); //获得图片的大小
ScreenToClient(&rect);
::GetCursorPos(pt); //获得鼠标的位置
if(rect.PtInRect(point)) //判断鼠标是否是在图片里面
{
CDialog2 dlg2;
dlg2.DoModal();
keypress=false;
}
}
CDialog::OnLButtonDown(nFlags, point);
}我试验过了,这种方法可以实现你的要求~~~
你试一下
首先:你要把将static控件ID设置为IDC_STATIC1;
其次:m_image为用类向导添加的控制变量
我也看不出是哪里出了问题,不过十分感谢你和其他诸位的帮助!