sobey mfc(139)

不解释,已经*到这种地步了,天天让我写mfc。。。。。想的心都有了。。。。。

下面说下过程中的事吧

listctrl:

感觉是坑货,要是duilib我特么早就自己写了,不用它的。

1、添加LVS_EX_CHECKBOXES属性,居然默认只能是第一列才能有。。我去。。。

用下面代码,把内部的链表换了,第一行后最后二行对换来达到其他列显示的效果。

CHeaderCtrl* pHeaderCtrl = m_lt_ShowProgram.GetHeaderCtrl();
INT nCount = pHeaderCtrl->GetItemCount();
LPINT pOder = (LPINT)malloc(nCount*sizeof(int));
pHeaderCtrl->GetOrderArray(pOder, nCount);
int nTemp = 0;
nTemp = pOder[0], pOder[0] = pOder[nCount - 2], pOder[nCount - 2] = nTemp;
pHeaderCtrl->SetOrderArray(nCount, pOder);
free(pOder);

2、还是问题,添加图片,你妹第一列老是默认必须添加图片。要想添加到其他列,还必须先添加第一列。晕!!!

ncount = m_lt_ShowProgram.InsertItem(ncount, _T(""), -1);//后来发现-1就插入空的图片。还行效果。\

3、遇见这个问题,反正愁死我了,winhand.cpp 218,,以后记住Object的操作,create要delete,get要release

4、enumwindow这个函数会一直循环遍历,唉!! 后来发现直接return false后,msdn说这是一个错误返回,好吧,弄成错误返回就立马结束了。

5、一直在纠结变长参数传递,居然用参数va_list 宏用va_args

6、容器指针简直是个坑,操作一切全是指针;写着写着就忘了,不解释。太坑了

7、switch case可以用tab缩进来达到效果,更本不用括号来。感觉这样倒是美观了。

8、#pragma component(browser, off, references, “ASSERT”)

9、

class property {
public:
    int m_a;
public:
    __declspec(property(get = GetA, put = SetA)) int x;

    int SetA(int x) {
        m_a = x;
        return x;
    }
    int GetA() {
        return m_a;
    }
};
//如此会导致property多拥有一个x的成员属性。
//这种就是把 x 和那俩个函数关联,关联方式就是get、put
//int a = property_class.x,就是get方式,调用GetA,property_class.x=a;就是put方式,调用SetA。

10、__declspec(novtable) 只能修饰类等结构。无法修饰函数,表示此类,不用产生虚函数列表,声明的函数却全是虚函数。意思就是,我就是专门为了继承的虚基类,我不用产生多余的空间容纳虚列表,因为实现全在子类。

11、MSVC的关键字__super 和java一样表示父类。

12、今天发现listctrl有个 LVN_BEGINDRAG的一个消息。。也就是说在消息映射里
ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST, OnBegindragFilelist)就会自动响应拖拽的事件。以前居然还自己写。。亏了。。。。。

13、以前写MFC的DLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的函数开始添加上AFX_MANAGE_STATE(AfxGetStaticModuleState())
切换,今天就遇见了,天的,公司老员工写的皮肤库太坑了。

14、

HBITMAP hbit;
BITMAP bit;
::GetObject(hbit, sizeof(BITMAP), &bit);//如此可以得到bitmap的图片大小

//CImageList需要先create在add,最后俩个参数,是开辟容纳大小,空间增长系数(不够了,扩容开辟多少个)

15、
基类虚函数,真心里面的成员变量要保证是protected,;
不然别人一拿来用,一下就呵呵了。

16、 SetMargins这个edit的控件,嘿嘿,设置左上角用的,加其他图片用的。

17、

我也是醉了,cedit控件必须设置顶层。不然上面16,你设置后重绘就没得玩。还有多行要设置
wndBottom:设置为底层窗口;
wndTop:设置顶层窗口;
wndTopMost:设置为最顶层窗口;
wndNoTopMost:设置为仅次于最顶层窗口

18、

来自:http://blog.csdn.net/lishuhuakai/article/details/18467255

(1)
CRect rect(0, 0, 200, 200);
dc.rectangle(rect);
上面的语句在屏幕的最左上角绘制一个正方形;(因为此时逻辑坐标与设备坐标没有偏移)

(2)
dc.SetViewportOrg(100, 100);
CRect rect(0, 0, 200, 200);
dc.rectangle(rect);
将设备坐标的原点设置到(100, 100);即设备坐标的原点不在(0, 0)处,而是在(100, 100)处;此时若执行映射的话,逻辑坐标的原点(0, 0)需要与设备坐标的原点(100, 100)重合(参考前提5);那么此时绘制的矩形(0, 0, 200, 200)的坐标(为逻辑坐标,参考前提1)在设备坐标中就会映射为(100, 100, 300, 300),最终我们在显示器上看到的会是一个向右下方偏移(100, 100)的一个边长为200的正方形(用户看到的点是在设备坐标中的,参考前提2)

(3)
dc.SetWindowOrg(100, 100);
CRect rect(0, 0, 200, 200);
dc.rectangle(rect);
将逻辑坐标的原点设置到(100, 100);即逻辑坐标的原点不在(0, 0)处,而是在(100, 100)处;此时若执行映射的话,设备坐标的原点(0, 0)需要与逻辑坐标的原点(100, 100)重合(参考前提5);那么此时绘制的矩形(0, 0, 200, 200)的坐标(为逻辑坐标,参考前提1)在设备坐标中就会映射为(-100, -100, 100, 100),最终我们在显示器上看到的会是一个只有1/4个大小的矩形的一部分(事实上相当于向左上方偏移(100, 100)的一个边长为200的正方形。

19、
CImageList要先Create再add才能成功
pImgeList ->Create(rtItem.Width(), rtItem.Height(),ILC_COLORDDB|ILC_MASK,0,1);个数,递增个数
pImgeList->Add(pbitmapt, TP_GetSysColor(COLOR_MODULE_LISTCTRL_ICONEDGE));

20、

给个拖拽的网址:

http://blog.csdn.net/xianglitian/article/details/6023656

http://www.codeguru.com/cpp/controls/treeview/dragdrop/article.php/c707/Drag-and-drop.htm

21、

CDockablePane和CPaneFrameWnd和CMFCCaptionButton,对了,这些是有源码的哟!!!嘿嘿

可以做出很多风格界面来。别忘了SetMiniFrameRTC(自定义::GetThisClass);

afxvisualmanagerofficexp.cpp 147动态获取颜色,创建brush
LOGBRUSH br
pBrush->GetLogBrush(&br);
CDrawingManager dm(*pDC);
dm.DrawRect(rect, br.lbColor, (COLORREF)-1);//这个是微软的caption按钮默认覆盖后图,因为很好看,保存了,

22、

3个消息分别是:WM_SIZE、WM_SIZING、WM_GETMINMAXINFO;分别对应相应的处理函数:OnSize、OnSizing、OnGetMinMaxInfo。

当窗口大小发生变化时,响应的顺序依次是:WM_GETMINMAXINFO–>WM_SIZING–>WM_SIZE

口初始化的时候会被调用一次->窗口大小发生变化时被调用->窗口大小改变结束后被调用,通常会在这个函数里重新摆放各个控件的位置及大小

23、

单文档和多文档。中间的view不同,dockpane窗口级别不同。具体细节很多,讲不清,今天代码可是坑苦了。

24、重新生成的项目老是清理其它项目的文件,看了下是中间文件目录的问题,改了就好

25、WM_MENUCHAR消息。在menu进行热键时,这个消息专门给父窗口来传递给menu(从返回值)。

26、CreateProcess,用来开辟新进程的时候。新进程的资源目录会优先寻找父目录(就是代码程序的目录)。为了避免这个情况倒数第三个参数可以专门用来设置。

27、pretranslatemessage这个是消息预处理函数。对于dll来说它的消息是依赖exe的,所以dll是没有这个函数的响应。这个函数的返回值0是消息下发,1是消息不下发。

// //