代码改变世界

我的第一个MFC小项目(1)之 初来咋到

2011-11-18 23:46  捣乱小子  阅读(1966)  评论(0编辑  收藏  举报

虽然是小项目,但是还是有点挑战性的,因为从来没有做过一个比较正式的项目;之前在编程过程当中,都是比较粗糙,想到什么就写什么,在没有一个系统的架构前提之下,虽可谓倚马可待,但bug很多,多到自己想法都没有了,最后不得不丢下个“四不像”的一堆代码。

找个借口原谅自己就是自觉阅读之前写下的代码,然后认真总结和分析,谈谈自己的收获。

其实也没什么,就一个处理图像的东西,很多的东西已经被sdk封装了,其实你能使用sdk到游刃有余的地步,那也是一种强的表现了,别被别人的闲言冷语冷落到“认为sdk没出息”。

重要的不是你学会了sdk什么的,重要的是你在完成一个任务的过程当中的收获,more or less。

功能列表

文件

获取图片信息

图像操作

打开

像素宽度

移动

*重新加载

像素高度

旋转

另存为

两点距离

放大

保存

每行象素所占字节数

缩小

退出

当然还有一些具体的要求。

 

因为需要用到显示位图,所以我也突发奇想要自定义一个控件,专门用来对付位图的处理,包括移动旋转之类的,感受到了吧,OO。开始的时候不去借助网络资源,自己操手干起来,但是遇到的问题还是蛮多的。

 

离开了win32一段时间了,来到MFC就忘本了。现在背背,

image

 

 

大概的过程就是这个(其实还是翻了书)。

 

自定义控件的思路也是这样的,只是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的(好奇怪)。如果你发现了,就告诉我。

传送门:

我的第一个MFC小项目(2)之 初涉位图


捣乱小子 2011-11-18