fillsolidrect_cstring转lparam_fillsolidrect 透明

电脑杂谈  发布时间:2017-03-10 14:21:04  来源:网络整理

fillsolidrect 透明_fillsolidrect_cstring转lparam

fillsolidrectfillsolidrect

"转VC/MFC 基于对话框的图片拖动利用内存DC防止图片闪烁":关键词:

在写一个基于对话框的mfc程序时,需要有鼠标拖动图片的功能,我在网上查了不少资料,发现大多数都是基于cview来实现的.基于cdialog的图片拖动例子很少,而且给出的例子还不太完整.在此,我把这几天参考网上的和自己编写的实现图片拖动的代码,完整贴出来,希望对大家有所帮助.

先说明下,我的是添加了一个图片控件idc_static,然后在此控件中来实现图片拖动.在整个绘制过程中,我利用了两个内存dc, 一个是选入bmp图片的内存dc, 另一个是绘制背景的内存dc(即与图片控件dc兼容的内存dc).

拖动与绘制图像的原理和过程简单介绍下,首先是靠鼠标按下,鼠标移动,鼠标抬起,这3个事件捕获鼠标的拖动,获取其拖动后的新坐标,然后调用invalidaterect()局部更新函数使拖过的部分区域重绘, 此过程系统调用cdialog的onpaint消息函数, 将绘制的所有代码放在这中,绘制时,先创建idc_static控件的背景位图,然后将位图选入绘

制背景的内存dc中,接下来,就可以在此dc上绘图.然后再创建拖动图片的内存dc,并将图片选入此dc中,最后两步就是将拖动图片的内存dc bitblt到绘制背景的内存dc上, 然后将绘制背景的内存dc再bitblt到idc_static控件的dc上.

代码如下:

.h文件

class cmydlg

{

//添加部分

private:

bool m_bcapture;

crgn m_rgn;

size m_off;//图片新位置与旧位置的偏移

cpoint m_pt;//图片的实时位置

size m_pic;//图片的尺寸

cbitmap m_bitmap;

};

.cpp文件

bool cmydlg::oninitdialog()

{

//添加部分

m_pt.x = 0;

m_pt.y = 0;

m_bcapture = false;

cwnd* pwnd = getdlgitem(idc_static);

bitmap bm;

m_bitmap.loadbitmap(monitor);

m_bitmap.getobject(sizeof(bm), &bm);

m_pic.cx = bm.bmwidth;

m_pic.cy = bm.bmheight;

}

fillsolidrect_cstring转lparam_fillsolidrect 透明

void cmydlg::onlbuttondown(uint nflags, cpoint point)

{

cwnd* pwnd = getdlgitem(idc_static);

crect rc;

pwnd->getclientrect(&rc);

this->clienttoscreen(&point);//对话框坐标转屏幕坐标

pwnd->screentoclient(&point);//再转控件坐标

crgn rgn;

rgn.createrectrgnindirect(&rc);

if ( rgn.ptinregion(point) )

{

setcapture();

m_bcapture=true;

m_off = point-m_pt;

setcursor(loadcursor(null,idc_cross));

}

cdialog::onlbuttondown(nflags, point);

}

void cmydlg::onmousemove(uint nflags, cpoint point)


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-36845-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...