我的第一个MFC小项目(1)之 初来咋到
2011-11-18 23:46 捣乱小子 阅读(1966) 评论(0) 编辑 收藏 举报虽然是小项目,但是还是有点挑战性的,因为从来没有做过一个比较正式的项目;之前在编程过程当中,都是比较粗糙,想到什么就写什么,在没有一个系统的架构前提之下,虽可谓倚马可待,但bug很多,多到自己想法都没有了,最后不得不丢下个“四不像”的一堆代码。
找个借口原谅自己就是自觉阅读之前写下的代码,然后认真总结和分析,谈谈自己的收获。
其实也没什么,就一个处理图像的东西,很多的东西已经被sdk封装了,其实你能使用sdk到游刃有余的地步,那也是一种强的表现了,别被别人的闲言冷语冷落到“认为sdk没出息”。
重要的不是你学会了sdk什么的,重要的是你在完成一个任务的过程当中的收获,more or less。
功能列表
文件 |
获取图片信息 |
图像操作 |
打开 |
像素宽度 |
移动 |
*重新加载 |
像素高度 |
旋转 |
另存为 |
两点距离 |
放大 |
保存 |
每行象素所占字节数 |
缩小 |
退出 |
当然还有一些具体的要求。
因为需要用到显示位图,所以我也突发奇想要自定义一个控件,专门用来对付位图的处理,包括移动旋转之类的,感受到了吧,OO。开始的时候不去借助网络资源,自己操手干起来,但是遇到的问题还是蛮多的。
离开了win32一段时间了,来到MFC就忘本了。现在背背,
大概的过程就是这个(其实还是翻了书)。
自定义控件的思路也是这样的,只是createwindow之后的东西(消息处理过程还是要我们操手)IDE帮我们做好了,注意就算在win32下我们还是要对控件createwindow的。上面说消息处理过程还是要自己动手,就是标准控件的消息处理过程已经被包装好了,但是我们自定义的控件会有我们自己想要处理的消息。
在对话框资源窗口添加了Custom Control之后,在属性对话框中要增加Class,在这里要注意填写的是你的注册窗口类而不是你的窗口类,明白人懂的。
添加了一个窗口类(继承自CWnd)之后,里边什么都没有,当然除了动态创建,消息映射,以及CWnd的一些函数还是有的,因为这是CWnd自有的,“爸爸有,儿子也要有”(C++里边的“遗传”好蛋疼)。任何一个窗口都要注册窗口类,所以一定要先在构造函数里面注册好。代码如下:
BOOL CBMPViewer::RegisterWndClass() { WNDCLASS windowclass; HINSTANCE hInst = AfxGetInstanceHandle(); windowclass.style = CS_HREDRAW | CS_VREDRAW |CS_OWNDC; windowclass.lpfnWndProc = ::DefWindowProc; windowclass.cbClsExtra = windowclass.cbWndExtra = 0; windowclass.hInstance = hInst; windowclass.hIcon = NULL; windowclass.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW); windowclass.hbrBackground =(HBRUSH)::CreateSolidBrush(#808a87); //::GetSysColorBrush(COLOR_WINDOW); windowclass.lpszMenuName = NULL; windowclass.lpszClassName = L"MYCLASS"; if (!AfxRegisterClass(&windowclass)) { AfxThrowResourceException(); return FALSE; } return TRUE; }
之后的话就不废话了,想干嘛就干嘛。
在自定义控件当中只有在onpaint()中的设备环境才是有效的,在其他的方法当中你也无法get到,这让我很疑惑,调试了一下,发现连hwnd都是unused的(好奇怪)。如果你发现了,就告诉我。
传送门:
捣乱小子 2011-11-18