永发信息网

vc按钮重绘问题

答案:2  悬赏:60  手机版
解决时间 2021-02-23 14:42
  • 提问者网友:雪舞兮
  • 2021-02-23 01:12
class CXButton : public CButton
自定了一个按钮重绘类出现两个问题,在此请教高手
一:用新类创建多个新按钮的话不知如何给每个按钮的写单击事件,不可能响应同样的功能是不。、
二:如果不创建动态按钮在工具栏中按钮控件添加按钮后再关连新类重绘,会出现第一个按钮还没按
就是按下和鼠标停留响应(动态的不会),如果点击其他窗口的话它又正常了...........。
关连如下:
void CWinVSDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON1, bu); //bu为CXButton 变量
DDX_Control(pDX, IDC_BUTTON2, bu1);
}
最佳答案
  • 五星知识达人网友:毛毛
  • 2021-02-23 02:38
1.继承 OnCommand 函数,里面的参数wParam就是按钮的ID
BOOL CSearchDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
    switch (wParam)
    {
        case IDC_OK: 
            SetWindowText("OK"); break;
        case IDC_CANCEL: 
            SetWindowText("Cancel"); break;
        default:
            return CDialog::OnCommand(wParam, lParam);
    }
    return TRUE;
}

2.不需要动态创建按钮,只要将你的按钮类型声明成你的新按钮类型

.h
CXButton bu;
CXButton bu1;
.cpp // 你现有的代码就可以,不用改了
DDX_Control(pDX, IDC_BUTTON1, bu); //bu为CXButton 变量
DDX_Control(pDX, IDC_BUTTON2, bu1);运行期就会有效果了
全部回答
  • 1楼网友:人類模型
  • 2021-02-23 03:51
1.画直线问题

实现鼠标移动中画线的思路是这样的

按下鼠标后,保存住按下时的鼠标位置,并设置一标记指明现在鼠标按下了

鼠标移动事件中,如果有鼠标按下的标记,就先重绘界面,然后在画一条线

鼠标释放的时候再画一条线

2.效率问题

频繁调用ondraw并不是效率低的原因

一个函数被频繁调用也不是效率低的体现

3.闪烁问题

这是一个经典问题

界面刷新的时候先要清空一次然后绘制

过程频繁的话必然引起闪烁

解决的办法是双缓冲

关键是取消背景擦除

就是响应wm_onerasebkgnd消息然后什么也不做

构建一个后台的内存位图

每次作图的时候在这个位图上作

然后在ondraw中将这个位图复制到界面上来

整幅图的复制是非常快的

这样的话就消除了闪烁

注:这里界面上的背景擦除去掉了

内存中的还是需要的

每次画线要先清空内存位图

涉及到你做的具体程序

你可能需要保持住之前已经画好的图形

这样你还需要一个内存位图协调工作

仔细想想

4.边界问题

鼠标出了边界

一般情况下鼠标的移动消息也就得不到了

windows提供了专门的函数解决这个问题

即在鼠标按下的同时捕获鼠标(setcapture)

这样鼠标出了边界,捕获鼠标的窗口也能收到鼠标移动消息

在鼠标弹起的时候注意释放捕获的鼠标(releasecapture)

5.双缓冲的资料

我学习这个时候的笔记,看看吧

http://hi.baidu.com/shilyx/blog/item/3662711e18ec7bf41ad576fc.html

http://hi.baidu.com/shilyx/blog/item/469f8b9462670a1ed31b7022.html
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯