MFC的问题,关于OnChar()函数和背景图片设置
两个问题:1、我想用OnChar()实现键盘响应,但是为什么没有反应代码如下:voidCrtyView::OnChar(UINTnChar,UINTnRepCnt,UIN...
两个问题:
1、我想用OnChar()实现键盘响应,但是为什么没有反应
代码如下:
void CrtyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox(_T("Can't create DC")); //异常处理
Dc.SelectObject(m_redrectangle);
if((nChar==(char)'A')||(nChar==(char)'a'))
{
pDC->StretchBlt(40,50,28,78,&Dc,0,0,28,78,SRCCOPY);
}
}
为什么就是没有反应?是不是因为我在执行程序的时候,系统认为我就是没有按“A”或“a”?我想要的效果达不到啊。。
2、关于图片背景。我的是单文档程序,窗口放大时,背景就错乱了。
void CrtyView::OnDraw(CDC* pDC)
{
CrtyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CRect rect(0,0,1024,768);
GetClientRect(rect);///取得客户区域
pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域
}
BOOL CrtyView::OnEraseBkgnd(CDC* pDC)
{
CView::OnEraseBkgnd(pDC);
return 0;
}
帮忙看看好吗?我是新手,网上说OnEraseBkgnd函数是可以在窗口大小改变时自适应的,怎么实现不了?
多谢了,我是大学生,在做小学期实习。。。谢谢!!!! 展开
1、我想用OnChar()实现键盘响应,但是为什么没有反应
代码如下:
void CrtyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox(_T("Can't create DC")); //异常处理
Dc.SelectObject(m_redrectangle);
if((nChar==(char)'A')||(nChar==(char)'a'))
{
pDC->StretchBlt(40,50,28,78,&Dc,0,0,28,78,SRCCOPY);
}
}
为什么就是没有反应?是不是因为我在执行程序的时候,系统认为我就是没有按“A”或“a”?我想要的效果达不到啊。。
2、关于图片背景。我的是单文档程序,窗口放大时,背景就错乱了。
void CrtyView::OnDraw(CDC* pDC)
{
CrtyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CRect rect(0,0,1024,768);
GetClientRect(rect);///取得客户区域
pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域
}
BOOL CrtyView::OnEraseBkgnd(CDC* pDC)
{
CView::OnEraseBkgnd(pDC);
return 0;
}
帮忙看看好吗?我是新手,网上说OnEraseBkgnd函数是可以在窗口大小改变时自适应的,怎么实现不了?
多谢了,我是大学生,在做小学期实习。。。谢谢!!!! 展开
展开全部
1,这个不太好判断,可能有多方面原因,需要根据实际代码判断。可能是因为焦点在按钮上,而键盘事件会被按钮自动屏蔽。
解决办法:你可以尝试重载 PreTranslateMessage
例如:
xxxdlg::PreTranslateMessage(msg *pmsg)
{
if(pMsg->message == wm_keyup)
{
switch (pmsg->wparam}
{
'a' :......
'b' .......
}
}
return xxxdlg::PreTranslateMessage(pmsg);
}
伪代码供参考,不能直接使用。
2,原因是因为
窗口放大时时Windows不会把整个客户区都无效,所以必须自己响应WM_SIZE,并手动把整个客户区无效化,这样才行。
解决办法:响应WM_SIZE消息,并在里面加一句:Invalidate();
解决办法:你可以尝试重载 PreTranslateMessage
例如:
xxxdlg::PreTranslateMessage(msg *pmsg)
{
if(pMsg->message == wm_keyup)
{
switch (pmsg->wparam}
{
'a' :......
'b' .......
}
}
return xxxdlg::PreTranslateMessage(pmsg);
}
伪代码供参考,不能直接使用。
2,原因是因为
窗口放大时时Windows不会把整个客户区都无效,所以必须自己响应WM_SIZE,并手动把整个客户区无效化,这样才行。
解决办法:响应WM_SIZE消息,并在里面加一句:Invalidate();
追问
可以讲具体一点吗?谢谢~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把::OnDraw的东西弄到::OnEraseBkgnd里面就可以了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、m_redrectangle是什么东西,你想画什么东西?
2、
BOOL CrtyView::OnEraseBkgnd(CDC* pDC)
{
CView::OnEraseBkgnd(pDC);
return TRUE;
}
2、
BOOL CrtyView::OnEraseBkgnd(CDC* pDC)
{
CView::OnEraseBkgnd(pDC);
return TRUE;
}
追问
第一个问题我已经解决了~谢谢了~其实是我构造函数的时候弄错了。。没有使用向导。。
第二个问题还是无法解决,可能是我的背景图片比较奇葩。。可以QQ联系吗?想请教一些问题~
934947535 加我的时候留个说明吧~谢啦~
另外我有点不懂ONCHAR函数的使用。希望可以私聊,谢谢~会有追加分的~
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
关于你的第二个问题,需要将坐标进行变换,屏幕坐标和客户区坐标的变换.似乎是screentoclient之类的函数,很久没有用到了,忘记了.你再查查坐标变换方面的资料吧.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询