给你们一个惊喜,千万不要错过哦

gz_qmc 2015-12-03 06:05:21
长期以来发现很多朋友队对自绘控件望而怯步
特意为大家举个例沟通以下
为了大家能很快掌握原理,我们不用任何类派生,就将就宿主窗口的DC完成
我用全世界最短小精干代码给大家一个原生态的自动刷新控件

一、头文件 MyCtrl.h
#ifndef  _MYCTRL_H_
#define _MYCTRL_H_

#define SSSEX 0x1234 //自定义消息

void WINAPI MyTimer(LPVOID lpParam); //定时器

class CMyCtrl
{
public:

//供宿主窗口显示时候调用
void Show(CDC *pDC);

//供宿主窗口设置刷新周期时候调用
void SetFlashFrev(long freq);

//供定时器调用进行刷新
void Update();

//供宿主窗口创建本控件的时候调用
BOOL Create(int x,int y,int w,int h,CWnd *Parent);

CMyCtrl();
~CMyCtrl();

protected:
//控件本身绘图
void OnDraw(CDC *pDC);

//需要刷新的数据计算
void OnFlash();

private:
HWND mParent; //宿主窗句柄
CRect mRect; //占据宿主窗口的地盘位置
long sx; //在宿主窗的占据位置的起点x
long sy; //在宿主窗的占据位置的起点y
long width; //在宿主窗的占据地盘的宽度
long heigh; //在宿主窗的占据地盘的高度

long fFreq; //刷新周期

COLORREF bkColor; //背景颜色
COLORREF tColor; //文本颜色

DWORD idTimer;
HANDLE thTimer;

long mx; //这个数据是拿来演示用的
long my; //这个数据是拿来演示用的
};

#endif

...全文
1141 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 18 楼 gz_qmc 的回复:
其实,好多人都不明白 越复杂的界面,用自绘越简单 关于闪速问题,大家把宿主窗口用双缓冲转一下就OK了
其实你要想想对于一些人来说,自绘远比不上去拿第三方库来的舒服
gz_qmc 2016-12-01
  • 打赏
  • 举报
回复
引用 56 楼 wangkuo106 的回复:
[quote=引用 18 楼 gz_qmc 的回复:] 其实,好多人都不明白 越复杂的界面,用自绘越简单 关于闪速问题,大家把宿主窗口用双缓冲转一下就OK了
其实你要想想对于一些人来说,自绘远比不上去拿第三方库来的舒服[/quote] 这个道理我恨懂 有一个成语叫饮鸠止渴 所以那部分人可以为饮鸠找足够多的理由 其实,你要饮鸠,谁也不能说你啥,对不? 短时间的舒服叫舒服,长期舒服也叫舒服 我是过来人,总不能睁眼说瞎话,说人家拿第三方库用就不舒服不是? 蚂蚁是二维动物,人是三维动物 所以蚂蚁认识人是不可能的,很复杂 而人要去研究蚂蚁简直是分分钟的事情 所以要事情变得简单有效,不是去低维度空间碰运气,而是去高维度空间找方法 程序是个多维的思考结果,第三方库不是不好,不是不能用 而是总用别人的思维结果去套自己的思维,永远有问题 你的维度低了,你套用不好别人的,你的维度高了,你又发现别人的满足不了需求 就算碰运气别人和你正好一个维度,依然有问题 因为配合的好的都是标准件 而恰恰我们追求的都是个性化的东西,叫非标 这不就变成南辕北辙了吗?
Joeshen_Shi 2016-09-26
  • 打赏
  • 举报
回复
引用 12 楼 _船长_的回复:
[quote=引用 11 楼 gz_qmc 的回复:] [quote=引用 8 楼 jzycode 的回复:] 重来不会把时间浪费在UI界面的开发上,如果BCG界面库中的控件不能满足要求,再去考虑自绘
从来不把时间花在基础上的人 从来就没有足够的时间做“正事” 吃饭拿筷子本来就是举手之劳 只有欧洲人才觉得拿筷子是可笑的 中国人概念里根本没有拿筷子这件事 因为那基本如同与生俱来本能一样, 不会因为难易效率去特意考证 你理解的界面可能是“花样好看” 而我理解的界面是功能齐全 比如带农历的日历控件 我不要求好看,你到是不自绘拖一个我看看? 实际生活工作中 这种非标控件要占那些库的N倍 我们最后用按钮,文本也能勉强凑出来 这就算是够用了的概念???????????????????????? 自己做一个一劳永逸 用基本控件凑的,换一下创新,删减一下功能又要排 到底是啥叫浪费时间呢?[/quote] 此观点不敢苟同,如果我用第三方界面库,分分钟钟就搞定的事,这种效率如何?简单的控件,你自绘没有任何问题,无非就是贴图(不管是GDI,还是GDI+),但对于一些稍微复杂的控件,你自绘一个试试?不累到你吐血,算你命大。 使用第三方界面库,一天能够搞定,你告诉你老板,我自绘,可以为公司省钱,但可能需要一个礼拜时间,你老板会接受?简直就就是笑话。 还是那句话,简单的控件,你爱怎么绘怎么绘,没有任何问题,复杂点的控件,你再去自绘,就是找死[/quote] 做着做着就有了自己轮子,不行啊。再说重绘一个需要花你说的一周么??
OnTheWay_Boy 2016-09-19
  • 打赏
  • 举报
回复
长此以往,碰到问题,不管难易,都不愿意自己思考解决问题,而是去找各种工具,工具不能完美解决问题,又去找其他工具解决新的问题,我是老板,我也不会太在意这种人
OnTheWay_Boy 2016-09-19
  • 打赏
  • 举报
回复
引用 52 楼 gz_qmc 的回复:
[quote=引用 51 楼 qq_29700255 的回复:] 新手不是很明白什么是自绘控件 大师的源码好像就是通过消息函数实现视图刷新,然后封装了借助定时器实现滚动的矩形绘制 是不是自绘控件就是自己封装类来实现一些特定功能呢
说的非常正确 功能达到效果,代码没有毛病,就是正道 什么稀奇古怪的控件,都只是一个简单的数据结构 用数据结构的数据和鼠标信息比较计算,就是所谓的消息响应 用窗口DC画处数据结构的描述样子,就是显示 [/quote] 终于体会到大师所说,只是使用别人做好的东西,不愿意自己思考的可怕了
gz_qmc 2016-09-18
  • 打赏
  • 举报
回复
引用 51 楼 qq_29700255 的回复:
新手不是很明白什么是自绘控件 大师的源码好像就是通过消息函数实现视图刷新,然后封装了借助定时器实现滚动的矩形绘制 是不是自绘控件就是自己封装类来实现一些特定功能呢
说的非常正确 功能达到效果,代码没有毛病,就是正道 什么稀奇古怪的控件,都只是一个简单的数据结构 用数据结构的数据和鼠标信息比较计算,就是所谓的消息响应 用窗口DC画处数据结构的描述样子,就是显示
OnTheWay_Boy 2016-09-14
  • 打赏
  • 举报
回复
第五 自绘,不是为公司省钱,而是要做到凡是想要的,信手拈来 不吹不黑,有这个理由,付出再多也值得
OnTheWay_Boy 2016-09-14
  • 打赏
  • 举报
回复
新手不是很明白什么是自绘控件 大师的源码好像就是通过消息函数实现视图刷新,然后封装了借助定时器实现滚动的矩形绘制 是不是自绘控件就是自己封装类来实现一些特定功能呢
wau 2016-04-07
  • 打赏
  • 举报
回复
神回复太多,楼主很强大
赵4老师 2016-02-23
  • 打赏
  • 举报
回复
现在是开源时代。 猪肉的口感好象和杀法还真有点关系。
赵4老师 2016-02-23
  • 打赏
  • 举报
回复
zhouxiaofeng1021 2016-01-14
  • 打赏
  • 举报
回复
你很自信~~~ 勇气很大~~~ 佩服佩服~~~ 甘拜下风~~~
github_21778701 2016-01-14
  • 打赏
  • 举报
回复
引用 44 楼 github_21778701 的回复:
我用的vs13,MFC多字节字符集没有集成进来,所以只能用Unicode。这就导致了字符串的类型和cstring不符,虽然我加了LPCSTR解决了编译通过,但是drawtext出来的无论是中文还是英文还是数字都是乱码,我知道是字符不匹配,但是试了一些方法,都不行。乱码的问题木有解决。
问题解决了,字符串用宽字符_T
github_21778701 2016-01-13
  • 打赏
  • 举报
回复
我用的vs13,MFC多字节字符集没有集成进来,所以只能用Unicode。这就导致了字符串的类型和cstring不符,虽然我加了LPCSTR解决了编译通过,但是drawtext出来的无论是中文还是英文还是数字都是乱码,我知道是字符不匹配,但是试了一些方法,都不行。乱码的问题木有解决。
gz_qmc 2015-12-10
  • 打赏
  • 举报
回复
引用 37 楼 schlafenhamster的回复:
多次 看到 你建议 用 CWnd 来 开发 控件(这也是 微软的), 还有点 道理。 现在 越发 走极端了, 居然 把 一块 rect 当作 控件了。
凡所有相,皆是虚妄。若见诸相非相,即见如来。你们对表面的东西过于执著,故真实现前,亦难开悟,微软的体系,就是大堆结构体,你信不信,反正我信了。
BeanJoy 2015-12-10
  • 打赏
  • 举报
回复
两点建议: 1.Sleep最好不要放在Update里,放在线程里好些。如果宿主调用一下Update来更新,岂不要等1秒才能返回,等这1秒完全没有任何意义。 2.窗口的自动更新最好放在Update里,不要由宿主接收到消息再来更新。窗口自动更新应该是此窗口内部功能,不应依赖于宿主。
schlafenhamster 2015-12-10
  • 打赏
  • 举报
回复
多次 看到 你建议 用 CWnd 来 开发 控件(这也是 微软的), 还有点 道理。 现在 越发 走极端了, 居然 把 一块 rect 当作 控件了。
gz_qmc 2015-12-10
  • 打赏
  • 举报
回复
我感谢来本贴捧场的朋友 但我真心希望你们能有所为 你不理解,可以问 你理解了,不赞同,可以提思路比较 你理解了,有更多的建议,功德无量 千万别再弄些概念是非之论 没意义 所谓杀猪杀屁股,各人有各人的杀法。 对吃肉的人来说,肉的质量和杀法半毛钱关系没有 对屠夫来说,手法高低是仁者见仁,智者见智
gz_qmc 2015-12-10
  • 打赏
  • 举报
回复
引用 38 楼 BeanJoy的回复:
两点建议: 1.Sleep最好不要放在Update里,放在线程里好些。如果宿主调用一下Update来更新,岂不要等1秒才能返回,等这1秒完全没有任何意义。 2.窗口的自动更新最好放在Update里,不要由宿主接收到消息再来更新。窗口自动更新应该是此窗口内部功能,不应依赖于宿主。
另外,由于用的是寄生的DC,只能通过宿主来更新,谁有突破这个的思路,欢迎分享
gz_qmc 2015-12-10
  • 打赏
  • 举报
回复
引用 38 楼 BeanJoy的回复:
两点建议: 1.Sleep最好不要放在Update里,放在线程里好些。如果宿主调用一下Update来更新,岂不要等1秒才能返回,等这1秒完全没有任何意义。 2.窗口的自动更新最好放在Update里,不要由宿主接收到消息再来更新。窗口自动更新应该是此窗口内部功能,不应依赖于宿主。
你说得非常的对 当然,我这么做是有原因的 线程传参,虽然原理只是个结构体指针,但对基础薄弱的人来说无疑是坨屎。 抓住主题,原理懂了,合理优化相信兴趣多多 凡事先必知其然,方能知其所以然。 感谢你的建议,给一些有所悟的人加了美餐
加载更多回复(37)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧