HappyLifeLife.com
HappyLifeLife.com
HappyLifeLife.com 登录 HappyLifeLife.com 注册 HappyLifeLife.com
爱新闻 爱生活
爱分享 爱学习
爱读书 爱探索
爱音乐 爱宇宙
爱电影 爱地球
爱阅读 爱世界
爱运动 爱科技
爱学习

<< < - > >>
C++
C++
www.HappyLiveLife.com 收藏 www.happylivelife.com
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
编辑
https://godbolt.org/https://www.codeproject.com/search.aspxhttps://max.book118.com/html/2016/0318/37963182.shtm错误 1 error C1083: 无法打开预编译头文件:“Debug\PlotData.pch”: No such file or directory e:\mcp prj\tmdataplotting\plotdata\src\stdafx.cpp 5 1 PlotData 解决办法:在解决方案资源管理器中:1、在stdafx.cpp上右键–>属性2、弹出的stdafx.cpp属性框中,选择配置属性–>C/C++–>预编译头3、在预编译头中选择“创建”,而不是原来默认的“使用”4、其他cpp文件默认“使用”就OK了  (一) 动态链接库和静态链接库  静态链接库:lib中的函数不仅被连接,全部实现都被直接包含在最终生成的EXE文件中,只是实现是不可见的。  动态链接库:dll不必被包含在最终的EXE中,静态调用时仅把函数名或者变量名或者类名链接到EXE文件中,而这些东西的实体都只有在运行时才从动态库中导入到可执行文件中,动态调用的时候EXE文件执行时可以直接动态地引用和卸载DLL文件。  同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库。    (二)VC++支持的DLL:  DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数(或变量、类)可供应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。    (三)导出函数的声明方式:  一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。  另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下:  LIBRARY 库工程名称  EXPORTS 导出函数名    (四)DLL的调用方式:  静态调用中,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。  动态调用中,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。  接下来写个例子把上面提到的理论都实践一遍。  一、 函数----创建动态链接库(MFC规则DLL)  1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名为MFC_dll  2. def文件中添加:函数名(Add_new)  3. h文件中添加:外部函数声明//求和函数,函数名为Add_new  extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b);  4. cpp文件中添加: 外部函数实现  extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b)  {  return a+b;  }  5. build--set active configuration--win32 release--ok  6. 生成  7. 根目录下release文件夹中dll,lib与根目录下h文件即为所需  二、 函数----调用动态链接库(把MFC_dll.dll和MFC_dll.lib拷到工程所在目录)  //静态调用(.h可以写到.cpp文件中)  1. new--projects--win32 console application--an empty project  2. 添加h文件:(test.h)  #pragma comment(lib,"MFC_dll.lib") //告诉编译器DLL相对应的lib文件所在路径和文件名  extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);//声明导入函数  3. 添加cpp文件:(main.cpp)  #include "test.h"  int main()  {  cout<  #include   typedef int ( lpAddFun)(int ,int);//定义一个与Add_new函数接受参数类型和返回值均相同的函数指针类型  int main()  {  HINSTANCE hDll;//句柄  lpAddFun addFun;//函数指针  hDll=LoadLibrary("dllTest.dll");//动态加载DLL模块句柄  if(hDll)  {  addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");//得到所加载DLL模块中函数的地址  if(addFun)  {  int result=addFun(2,3);  printf("%d",result); } FreeLibrary(hDll);//释放已经加载的DLL模块  }  return 0;  }  三、 变量----创建动态链接库(非MFC DLL)  1. new---projects---win32 dynamic-link library----an empty project(Sample)  2. 添加sample.h  #ifndef SAMPLE_H  #define SAMPLE_H  extern int dllGlobalVar;  #endif  3. 添加 sample.cpp  #include "sample.h"  #include   int dllGlobalVar;  bool APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)  //windows在加载DLL时,需要一个入口函数,就如同控制台或DOS程序需要main函数、win32程序需要winmain函数一样。所以引入一个不做任何操作的缺省DllMain的函数版本。是DLL的内部函数。      有一点要注意,如果看到此类宏定义  #ifdef KSCANBAR_EXPORTS  #define KSCANBAR_API __declspec(dllexport)  #else  #define KSCANBAR_API __declspec(dllimport)  #endif  是因为这样定义一般出现在含有多个项目的解决方案中,这样可以使从 DLL 导出更简单的宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 KSCANBAR_EXPORTS符号编译的。在使用此 DLL 的任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将KSCANBAR_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的符号视为是被导出的。MFC中实现用DC画线void CDrawView::OnLButtonDown(UINT nFlags, CPoint point){ // TODO: Add your message handler code here and/or call default //MessageBox("view clicked"); m_ptOrigin = point; m_bDraw = TRUE; CView::OnLButtonDown(nFlags, point);}void CDrawView::OnLButtonUp(UINT nFlags, CPoint point){ // TODO: Add your message handler code here and/or call default第一种:使用API函数/ HDC hdc; hdc = ::GetDC(m_hWnd); MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); LineTo(hdc,point.x,point.y); ::ReleaseDC(m_hWnd,hdc);/第二种:使用CDC类实现 /CDC pDC = GetDC(); pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); ReleaseDC(pDC); /第三种:使用CClientDC /CClientDC dc(this); //CClientDC dc(GetParent()); dc.MoveTo(m_ptOrigin); dc.LineTo(point);/第四种:使用CWindowDC /CWindowDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point);/ /CPen pen(PS_SOLID,2,RGB(255,0,0));//设置画笔的样式颜色 CClientDC dc(this); CPen pOldPen = dc.SelectObject(&pen); dc.MoveTo(m_ptOrigin); dc.LineTo(point); dc.SelectObject(pOldPen);/ //CBrush brush(RGB(255,2,2));//使用画刷,设置画刷的样式颜色 /CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); CBrush brush(&bitmap); CClientDC dc(this); dc.FillRect(CRect(m_ptOrigin,point),&brush);/ /CClientDC dc(this); CBrush pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH))//设置透明画刷 CBrush pOldBrush = dc.SelectObject(pBrush); dc.Rectangle(CRect(m_ptOrigin,point)); dc.SelectObject(pOldBrush);/ m_bDraw = FALSE; CView::OnLButtonUp(nFlags, point);}画曲线的方法:void CDrawView::OnMouseMove(UINT nFlags, CPoint point){ // TODO: Add your message handler code here and/or call default CClientDC dc(this); CPen pen(PS_SOLID,1,RGB(255,6,66)); CPen pOlePen = dc.SelectObject(&pen);  if(m_bDraw == TRUE) {  dc.MoveTo(m_ptOrigin);  dc.LineTo(point);  m_ptOrigin = point; } dc.SelectObject(pOlePen); CView::OnMouseMove(nFlags, point);}SetForegroundWindow函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。CDockablePane是一个通用窗口容器,它主要有两个用途:在一个框架中悬浮或者停靠窗口。在复杂布局的应用程序中,它可以显示或隐藏所装载的窗口,为应用程序窗口提供额外的空间。有关菜单的操作主要用到CMenu类,当然也可用相应API函数,CMenu类只是MFC对API中操作菜单的函数的封装而已。 不过能用类就尽量用类,类的组织方式好呗,代码看着也舒服。 若是SDK编程,那就用API吧 。 CMenu menuMain,menu1; //首先 定义CMenu对象一、 创建菜单,有两种方法1. 用LoadMenu函数从资源加载menuMain.LoadMenu(IDR_MAINFRAME); //从资源加载,这里使用SDI的主菜单资源2. 用CreateMenu函数创建menu1.CreateMenu(); //创建菜单,还没有菜单项二、 添加菜单项,可用AppendMenu()在菜单的最后加、InsertMenu()在指定的位置加.// ID_TEST1 在Resource.h 中定义,随便给个整数值,不要和已有的重复就行了menu1.AppendMenu(MF_STRING,ID_TEST1,"Test1"); // 第一项菜单项menu1.AppendMenu(MF_STRING,ID_TEST2,"Test2"); // 第二项菜单项menu1.InsertMenu(1,MF_BYPOSITION|MF_STRING,(UINT)ID_TEST1,"ID_TEST1"); // 在第二项菜单项前添加新菜单项三、 添加子菜单同样用AppendMenu()、InsertMenu()函数。不过要注意参数的设置。menu1.AppendMenu(MF_BYPOSITION|MF_POPUP|MF_STRING,(UINT) menuMain.GetSubMenu(0) ->m_hMenu,"子菜单");//第二个参数是菜单的句柄HMENU四、 删除菜单用DeleteMenu()、RemoveMenu()函数来删除指定位置的菜单/菜单项。两者区别:如果菜单项是一个弹出式菜单,那么DeleteMenu和RemoveMenu之间的区别就很重要。DeleteMenu清除弹出式菜单,但RemoveMenu不清除它。一个是彻底的删除,一个只是移除.MSDN: 1.The DeleteMenu function destroys the handle to the menu or submenu and frees the memory used by the menu or submenu. 它使菜单或者子菜单的handle无效(destroys)。2. RemoveMenu does not destroy the menu or its handle, allowing the menu to be reused. 可以再利用,并不从内存中将menu删除。五、 添加右键菜单CMenu menu1; menu1.CreatePopupMenu(); //动态创建弹出式菜单对象 menu1.AppendMenu(MF_STRING,ID_TEST1," 菜单项1"); menu1.AppendMenu(MF_STRING,ID_TEST2," 菜单项2");menu1.InsertMenu(2,MF_BYPOSITION|MF_POPUP|MF_STRING, (UINT) menuMain.m_hMenu,"子菜单"); //添加子菜单 CPoint pt; GetCursorPos(&pt); menu1.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); menu1.DestroyMenu();LEA指令的百功能是取偏移地址,例如LEA AX,[1000H],作用是将源度操作数[1000H]的偏移地址1000H送至AX;MOV指令的功能是传送知数据,例如MOV AX,[1000H],作用道是将1000H作为偏移地址,寻址找到内内存单元,将该内存单元中的数据送至容AX。MOV指令的功百能是传送数据,例如MOV AX,[1000H],作用是将1000H作为偏移地址,寻址找到内存单元,将该内存单元中的度数据送至AX;LEA指令的知功能是取偏移地址道,例如LEA AX,[1000H],作用是将源操作数[1000H]的偏移地址1000H送至AX。理解时,可直接将[ ]去掉,等同于MOV AX,1000H。再如内:LEA BX,[AX],等同于MOV BX,AX;LEA BX,TABLE 等同于 MOV BX,OFFSET TABLE。但有时不能直接使用MOV代替:比如:LEA AX,[SI+6] 不能直接替换成:MOV AX,SI+6;但可替换为:MOV AX,SIADD AX,6两步完成mov默认对寄存器值或变量值进行操作,可以从寄存器到寄存器,从立即数到寄存器,从存储单元到寄存器,从立即数到存储单元,从寄存器到存储单元,【从寄存器或存储单元到段寄存器(除CS寄存器),立即数不能值接送段寄存器】但是注意 (1) MOV指令中的源操作数绝对不能是立即数和代码段CS寄存器; (2) MOV指令中绝对不允许在两个存储单元之间直接传送数据; (3) MOV指令中绝对不允许在两个段寄存器之间直接传送数据; (4) MOV指令不会影响标志位对于变量,加不加[]都表示取值;对于寄存器而言,无[]表示取值,有[]表示取地址。 lea是load effective address 的缩写,是取源操作数的偏移地址,并将其传送到目的操作数单元。类似于C语言的取地址符&。对于变量,其后面的有无[]皆可,都表示取变量地址,相当于指针。对于寄存器而言,无[]表示取地址,有[]表示取值。 例:SI=1000H, DS=1000H, (5100H)=2345HMOV BX, [SI]; BX为2345HLEA BX, [SI]; BX为1000H--------------------------------------102 -101n30m01-102n30首先获取dialog的初始大小,当窗口发送变动时,调用OnSize事件和方法,计算缩放比例,然后对界面中的所有控件进行缩放和布局。实现:创建一个CMFCDemoDlg的dialog对话框;复制代码// CMFCDemoDlg 对话框class CMFCDemoDlg : public CDialogEx{// 构造public: CMFCDemoDlg(CWnd pParent = NULL); // 标准构造函数// 对话框数据 enum { IDD = IDD_MFCDEMO_DIALOG }; protected: virtual void DoDataExchange(CDataExchange pDX); // DDX/DDV 支持protected: CRect m_rect; void ChangeSize(UINT nID,int x,int y); void ReSize(void); POINT old; protected: // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSize(UINT nType, int cx, int cy); DECLARE_MESSAGE_MAP()};复制代码在OnInitDialog方法中获取dialog的初始大小,记录到old变量中;注册OnSize事件处理方法(ON_WM_SIZE(), OnSize()函数),设置控件大小复制代码CMFCDemoDlg::CMFCDemoDlg(CWnd pParent /=NULL/) : CDialogEx(CMFCDemoDlg::IDD, pParent){ m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CMFCDemoDlg::DoDataExchange(CDataExchange pDX){ CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CMFCDemoDlg, CDialogEx) ON_WM_SIZE()END_MESSAGE_MAP()// CMFCDemoDlg 消息处理程序BOOL CMFCDemoDlg::OnInitDialog(){ CDialogEx::OnInitDialog(); // 获取对话框初始大小 GetClientRect(&m_rect); //获取对话框的大小 old.x=m_rect.right-m_rect.left; old.y=m_rect.bottom-m_rect.top; return TRUE;}void CMFCDemoDlg::ReSize(void) { float fsp[2]; POINT Newp; //获取现在对话框的大小 CRect recta; GetClientRect(&recta); //取客户区大小 Newp.x=recta.right-recta.left; Newp.y=recta.bottom-recta.top; fsp[0]=(float)Newp.x/old.x; fsp[1]=(float)Newp.y/old.y; CRect Rect; int woc; CPoint OldTLPoint,TLPoint; //左上角 CPoint OldBRPoint,BRPoint; //右下角 HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD); //列出所有控件 while(hwndChild){ woc=::GetDlgCtrlID(hwndChild);//取得ID GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect); OldTLPoint = Rect.TopLeft(); TLPoint.x = long(OldTLPoint.xfsp[0]); TLPoint.y = long(OldTLPoint.yfsp[1]); OldBRPoint = Rect.BottomRight(); BRPoint.x = long(OldBRPoint.x fsp[0]); BRPoint.y = long(OldBRPoint.y fsp[1]); Rect.SetRect(TLPoint,BRPoint); GetDlgItem(woc)->MoveWindow(Rect,TRUE); hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT); } old=Newp; } void CMFCDemoDlg::OnSize(UINT nType, int cx, int cy){ CDialogEx::OnSize(nType,cx,cy); if(nType!=SIZE_MINIMIZED ) //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作 { ReSize(); }}复制代码通过hwndChild=::GetWindow(m_hWnd,GW_CHILD);和::GetWindow(hwndChild, GW_HWNDNEXT); 列出所有控件 也可针对特定控件设置其大小,如:复制代码//change control sizevoid CMFCDemoDlg::ChangeSize(UINT nID,int x,int y){ CWnd pWnd = GetDlgItem(nID); if(pWnd!=NULL) { CRect rec; pWnd->GetWindowRect(&rec);//获取控件变化前的大小 ScreenToClient(rec); //将控件大小装换位在对话框中的区域坐标 // x / m_rect.Width(); 伸缩rate rec.left = rec.left x / m_rect.Width(); rec.top = rec.top y / m_rect.Height(); rec.bottom = rec.bottom y / m_rect.Height(); rec.right = rec.right x / m_rect.Width(); pWnd->MoveWindow(rec);//伸缩控件 }}HBRUSH hbr;第一种: hbr= CreateSolidBrush(RGB(255,0,0)); //单色的画刷第二种: hbr= (HBRUSH)GetStockObject(BLACK_BRUSH); //只能取特定颜色的画刷,如BLACK_BRUSH,GRAY_BRUSH等刷第三种: hbr= CreatePatternBrush(HBITMAP hbmp); //得到位图画刷第四种: hbr = CreateHatchBrush(int fnStyle, COLORREF clrref) //创建一种带阴影的画刷第五种: hbr= CreateBrushIndirect(LOGBRUSH); //通过LOGBRUSH结构体来取画刷 typedef struct tagLOGBRUSH { UINT lbStyle; //画刷类型 COLORREF lbColor; //颜色 LONG lbHatch; //阴影} LOGBRUSH, PLOGBRUSH;第六种: hbr= HBRUSH CreateDIBPatternBrush( //通过与设备无关位图创建一个画刷 HGLOBAL hglbDIBPacked, // handle to DIB UINT fuColorSpec // color table data );例如:HBRUSH CAfdView::OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor){HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: Change any attributes of the DC hereif (pWnd->GetDlgCtrlID()==IDC_STATIC1){ pDC->SetTextColor(RGB(200,0,0)); pDC->SetBkColor(RGB(0,0,255)); static HBRUSH hBrush = CreateSolidBrush(RGB(222,0,255)); return hBrush;} // TODO: Return a different brush if the default is not desiredelse return hbr;}改变对话框背景色HBRUSH CDqfDlg::OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: Change any attributes of the DC here// TODO: Return a different brush if the default is not desiredif(nCtlColor == CTLCOLOR_DLG) { CBrush brush; brush = new CBrush(RGB(221,221,221)); return (HBRUSH)(brush->m_hObject); }return hbr;}HBRUSH CTest1Dlg::OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor) {HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: Change any attributes of the DC hereCFont m_font; //声明变量m_font.CreatePointFont(600,"华文行楷"); //设置字体大小和类型if(pWnd->GetDlgCtrlID()==IDC_STATIC01)//可以用CTLCOLOR_STATIC表示静态控件{ pDC->SelectObject(&m_font); //设置字体 pDC->SetTextColor(RGB(0,0,255)); //设置字体颜色 pDC->SetBkMode(TRANSPARENT); //属性设置为透明 return (HBRUSH)::GetStockObject(NULL_BRUSH); //不返回画刷}// TODO: Return a different brush if the default is not desiredreturn hbr;}Radio和Check代码如下HBRUSH CLoginDlg::OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor){ //HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); HBRUSH hbr = ::CreateSolidBrush(#f9f9f9); // TODO: Change any attributes of the DC here if (pWnd->GetDlgCtrlID() == IDC_RADIO_REALNAME || pWnd->GetDlgCtrlID() == IDC_RADIO_ANONYMOUS || pWnd->GetDlgCtrlID() == IDC_CHECK_SELFSELECT) { pDC->SetBkMode(TRANSPARENT); CRect rc; pWnd->GetWindowRect(&rc); ScreenToClient(&rc); CDC dc = GetDC(); pDC->BitBlt(0,0,rc.Width(),rc.Height(),dc,rc.left,rc.top,SRCCOPY); //把父窗口背景先画到按钮上 ReleaseDC(dc); hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH); }}IMPLEMENT_DYNAMIC是实现“运行时类型识别”宏,与之相对应的是DECLARE_DYNAMIC(声明“运行时类型识别”宏)。也就是说你在.CPP文件中如果看见有IMPLEMENT_DYNAMIC,则在.H文件中必定有DECLARE_DYNAMIC的声明。 DECLARE_DYNAMIC/DEClARE_DYNAMIC是为了确定运行时对象属于哪一个类而定义的宏。 DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE是为了“动态创建"类的实例而定义的宏。new可以用来创建对象,但不是动态的。比如说,你要在程序中实现根据拥护输入的类名来创建类的实例,下面的做法是通不过的: char szClassName[60]; cin >> szClassName; CObject pOb=new szClassName; //通不过 这里就要用到DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE定义的功能了。MFC设置控件背景透明添加消息响应WM_CTLCOLOR,Static代码如下:HBRUSH CTest1Dlg::OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor) {HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: Change any attributes of the DC hereCFont m_font; //声明变量m_font.CreatePointFont(600,"华文行楷"); //设置字体大小和类型if(pWnd->GetDlgCtrlID()==IDC_STATIC01)//可以用CTLCOLOR_STATIC表示静态控件{ pDC->SelectObject(&m_font); //设置字体 pDC->SetTextColor(RGB(0,0,255)); //设置字体颜色 pDC->SetBkMode(TRANSPARENT); //属性设置为透明 return (HBRUSH)::GetStockObject(NULL_BRUSH); //不返回画刷}// TODO: Return a different brush if the default is not desiredreturn hbr;}Radio和Check代码如下HBRUSH CLoginDlg::OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor){ //HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); HBRUSH hbr = ::CreateSolidBrush(#f9f9f9); // TODO: Change any attributes of the DC here if (pWnd->GetDlgCtrlID() == IDC_RADIO_REALNAME || pWnd->GetDlgCtrlID() == IDC_RADIO_ANONYMOUS || pWnd->GetDlgCtrlID() == IDC_CHECK_SELFSELECT) { pDC->SetBkMode(TRANSPARENT); CRect rc; pWnd->GetWindowRect(&rc); ScreenToClient(&rc); CDC dc = GetDC(); pDC->BitBlt(0,0,rc.Width(),rc.Height(),dc,rc.left,rc.top,SRCCOPY); //把父窗口背景先画到按钮上 ReleaseDC(dc); hbr = (HBRUSH) ::GetStockObject(NULL_BRUSH); }}把CListCtrl设置为Report风格,但是插入第一列的时候(InsertColumn)的时候会发现文字不能居中。即使使用了LVCFMT_CENTER,其他列都可以正常居中,但第一列仍然靠左显示。解决方案:(1)插入第一列时宽度设置为0,弃之不用。但是这样有问题,凡是与第一列相关的一些设置将发挥不了作用,例如checkbox和icon。(2)插入第一列后,改变它的参数:(我使用了这种方法)复制代码LVCOLUMN lvc;lvc.mask = LVCF_FMT;GetColumn(0, &lvc);lvc.fmt &=~ LVCFMT_JUSTIFYMASK; lvc.fmt |= LVCFMT_CENTER;SetColumn(0, &lvc);复制代码(3)插入第一列后,将其删除,第二列此时会充当第一列。第一列式不能设置格式,MSDN里有说明:If a column is added to a list-view control with index 0 (the leftmost column) and with LVCFMT_RIGHT or LVCFMT_CENTER specified, the text is not right-aligned or centered. The text in the index 0 column is left-aligned. Therefore if you keep inserting columns with index 0, the text in all columns are left-aligned. If you want the first column to be right-aligned or centered you can make a dummy column, then insert one or more columns with index 1 or higher and specify the alignment you require. Finally delete the dummy column.大致意思是这样的:索引为0的列(最左边的列)如果设置了LVCFMT_RIGHT或LVCFMT_CENTER属性,上面的文字并不会右对齐或居中对齐。索引为0 的列是左对齐。如果你要想第一列右对齐或者居中对齐,你可以这样做,先保留索引为0的列,其他的列均指定右对齐或居中对齐属性,最后删除索引为0的列。下面是实例代码:m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);CString str[] ={_T(""), _T("AAA"), _T("BBB"), _T("CCC"), _T("DDDD"), _T("EEE")};for(int i=0; iSubclassWindow(pHeader->GetSafeHwnd());::SetWindowPos(this->GetSafeHwnd(), HWND_TOPMOST, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, 0);switch (IsDlgButtonChecked(IDC_CHECK_FLREADUSERSET))   {   case BST_CHECKED:        //按钮被选中           break;    case BST_UNCHECKED:         //按钮没被选中           break;    case BST_INDETERMINATE:     //按钮选中状态不确定           break;    default:      break;   } 三、动态设置复选框状态CButton pBtn = (CButton)GetDlgItem(IDC_CHECK);  //获得复选框控件的句柄int state = pBtn->GetCheck();  //判断复选框控件当前状态:勾选或不勾选      if(state == 0)        {            MessageBox(_T("勾选"));        }        else        {            MessageBox(_T("不勾选"));        }  设置选择状态: (CButton )GetDlgItem(IDC_CHECK))->SetCheck(1);//————————————————virtual BOOL PreTranslateMessage(MSG pMsg);{    if( pMsg->message == WM_KEYDOWN )    {        switch( pMsg->wParam )        {           case VK_NUMPAD0:                 break;           case VK_NUMPAD1:              break;       }    return CDialog::PreTranslateMessage(pMsg);}————————————————HWND_BROADCAST广播消息处于同一台电脑的进程A,要给进程B发数据。但是进程B的主窗口在创建时,没有指定类名,也没有指定窗口名,所以无法通过::FindWindow()来获得窗口句柄,从而发消息。后来解决办法是通过HWND_BROADCAST广播消息。发送方:首先,注册消息const UINT WM_WSW_ShowQRCode = ::RegisterWindowMessage(_T("WSW_ShowQRCode_Function")); 接着就可以发送消息:::PostMessage(HWND_BROADCAST, WM_WSW_ShowQRCode, 0, 0); // 或者sendMessage也可以接收方:同样需要注册这个消息:const UINT WM_WSW_ShowQRCode = ::RegisterWindowMessage(_T("WSW_ShowQRCode")); 接收到消息后,响应消息:ON_REGISTERED_MESSAGE(WM_WSW_ShowQRCode, OnShowQRCode_WSW)总结:HWND_BROADCAST,是对所有通过RegisterWindowMessage方法注册了同一个消息的窗口,都发送广播(此文中为,对所有注册了WSW_ShowQRCode消息的窗口,都广播)。对于无法获得窗口的句柄时,才采用此方法。————————————————RECT rc = {0, 0, 20, 20}; m_btnClose.LoadBtnImg(_T("PNG"),IDB_PNG_TAB_CLOSE_NOR, IDB_PNG_TAB_CLOSE_HOT,IDB_PNG_TAB_CLOSE_HOT); m_btnClose.Create(this, rc, L"",ID_BTN_MYTAB_CLOSE); m_btnClose.SetToolTipText(_T("关闭")); //头文件 #pragma once // CLhsButton #define MYWM_BTN_CLICK WM_USER+3001 //关闭按钮单击响应 //tab按钮的状态enum ButtonState{ BTN_STATE_NOR = 0, BTN_STATE_DOWN = 1,}; class CLhsButton : public CWnd{ DECLARE_DYNAMIC(CLhsButton) public: CLhsButton(); virtual ~CLhsButton(); bool Create(CWnd pParent,CRect rc,CString text,DWORD id = 0,DWORD style = WS_VISIBLE|WS_CHILD); DECLARE_MESSAGE_MAP() public: protected: CString szClassName; bool m_isMouseHover; //鼠标是否悬浮 bool m_isMouseClicked; //鼠标是否单击 CString m_strShowText; //要显示的文字 Image m_pImgNor; //正常时的图片 Image m_pImgHot; //鼠标悬浮时的图片 Image m_pImgDown; //单击按下时的图片 void PostClickEvent(); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnMouseHover(UINT nFlags, CPoint point); afx_msg void OnMouseLeave(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg BOOL OnEraseBkgnd(CDC pDC); afx_msg void OnPaint(); afx_msg void OnSize(UINT nType, int cx, int cy); virtual BOOL PreTranslateMessage(MSG pMsg);public: void SetTabState(ButtonState state){m_btnState = state; Invalidate();} //设置tab状态 ButtonState GetTabState(){return m_btnState;} void SetToolTipText(CString spText, BOOL bActivate = TRUE); void LoadBtnImg(LPCTSTR tType, UINT nNorID, UINT nHotID, UINT nDownID); //加载按钮图片 private: ButtonState m_btnState; //tab的状态 CToolTipCtrl m_pToolTip; CString m_tooltext; public: afx_msg HBRUSH OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor);}; //源文件// CLhsButton.cpp : 实现文件// #include "stdafx.h"#include "../Lander_mini.h"#include "memdc.h"#include "../Utility.h"#include "LhsButton.h"// CLhsButton IMPLEMENT_DYNAMIC(CLhsButton, CWnd) CLhsButton::CLhsButton(){ m_isMouseHover = false; m_isMouseClicked = false; // 注册控件类 szClassName = AfxRegisterWndClass(0); m_pImgNor = NULL; m_pImgHot = NULL; m_pImgDown = NULL; m_btnState = BTN_STATE_NOR; m_pToolTip = NULL; } CLhsButton::~CLhsButton(){ SAFE_RELEASE(m_pToolTip); SAFE_RELEASE(m_pImgNor); SAFE_RELEASE(m_pImgHot); SAFE_RELEASE(m_pImgDown);} BEGIN_MESSAGE_MAP(CLhsButton, CWnd) ON_WM_MOUSEMOVE() ON_WM_MOUSEHOVER() // 此消息系统并不会给我们发送 ON_WM_MOUSELEAVE() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_PAINT() ON_WM_SIZE() ON_WM_ERASEBKGND() ON_WM_CREATE() ON_WM_CTLCOLOR()END_MESSAGE_MAP() // CLhsButton 消息处理程序bool CLhsButton::Create(CWnd pParent,CRect rc,CString text,DWORD id / = 0 /,DWORD style / = WS_VISIBLE|WS_CHILD /) { // 动态创建控件 BOOL ret = CWnd::CreateEx(0, szClassName, text, style, rc, pParent, id); return ret ? true : false; } int CLhsButton::OnCreate(LPCREATESTRUCT lpCreateStruct){ //::SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) ^ WS_EX_LAYERED); //ModifyStyle(WS_CLIPCHILDREN, 0); //ModifyStyle(0, WS_CLIPCHILDREN , 0); return 0;} void CLhsButton::PostClickEvent() { // 该函数用来向父窗口发送 单击 消息 CWnd parent = GetParent(); if(parent) parent->SendMessage(MYWM_BTN_CLICK, 0,0); } void CLhsButton::OnMouseHover(UINT nFlags, CPoint point) { // 鼠标进入 Invalidate(); } void CLhsButton::OnMouseMove(UINT nFlags, CPoint point){ // 只处理鼠标第一次进入时的情况 if(!m_isMouseHover) { m_isMouseHover = true; TRACKMOUSEEVENT evt = { sizeof(evt), TME_LEAVE|TME_HOVER, m_hWnd, 0 }; TrackMouseEvent(&evt); OnMouseHover(0,CPoint()); } } void CLhsButton::OnMouseLeave() { // 鼠标离开 m_isMouseHover = false; m_isMouseClicked = false; Invalidate(); } void CLhsButton::OnLButtonDown(UINT nFlags, CPoint point) { // 鼠标按下 m_isMouseClicked = true; Invalidate(); } void CLhsButton::OnLButtonUp(UINT nFlags, CPoint point) { // 鼠标松开 if(m_isMouseClicked) { m_isMouseClicked = false; Invalidate(); PostClickEvent(); } } BOOL CLhsButton::OnEraseBkgnd(CDC pDC) { // return CWnd::OnEraseBkgnd(pDC); return TRUE; // 阻止擦除背景,防止闪烁 } void CLhsButton::OnPaint() { CPaintDC dc(this); CRect rc; GetClientRect(&rc); // 采用双缓存,防止闪烁 CMemDC memdc(&dc,&rc,TRUE); Graphics graphic(memdc); if (!m_pImgNor || !m_pImgHot || !m_pImgDown) {//没有提供按钮图片就刷下背景 // 刷背景 COLORREF bkgnd = RGB(100,0,0); if(m_isMouseHover) { if(m_isMouseClicked) bkgnd = RGB(250,0,0); else bkgnd = RGB(180,0,0); } memdc.FillSolidRect(&rc,bkgnd); } if (m_isMouseClicked || m_btnState == BTN_STATE_DOWN) {//单击一定画单击状态 graphic.DrawImage(m_pImgDown, 0, 0, m_pImgDown->GetWidth(), m_pImgDown->GetHeight()); } else if (m_isMouseHover && !m_isMouseClicked) { //悬浮,但是没单击 graphic.DrawImage(m_pImgHot, 0, 0, m_pImgHot->GetWidth(), m_pImgHot->GetHeight()); } else { graphic.DrawImage(m_pImgNor, 0, 0, m_pImgNor->GetWidth(), m_pImgNor->GetHeight()); } // 使绘制生效 graphic.ReleaseHDC(memdc); } BOOL CLhsButton::PreTranslateMessage(MSG pMsg) { if (m_pToolTip) { if (::IsWindow(m_pToolTip->m_hWnd)) { m_pToolTip->RelayEvent(pMsg); } } return CWnd::PreTranslateMessage(pMsg);} void CLhsButton::OnSize(UINT nType, int cx, int cy) { } void CLhsButton::SetToolTipText(CString spText, BOOL bActivate){ if (m_pToolTip == NULL) { m_pToolTip = new CToolTipCtrl; // Create ToolTip control m_pToolTip->Create(this); m_pToolTip->Activate(TRUE); } m_tooltext = spText; // If there is no tooltip defined then add it if (m_pToolTip->GetToolCount() == 0) { CRect rectBtn; GetClientRect(rectBtn); m_pToolTip->AddTool(this, m_tooltext, rectBtn, 1); } // Set text for tooltip m_pToolTip->UpdateTipText(m_tooltext, this, 1); m_pToolTip->SetDelayTime(2000); m_pToolTip->Activate(bActivate);} HBRUSH CLhsButton::OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor){ HBRUSH hbr = CWnd::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何属性 // TODO: 如果默认的不是所需画笔,则返回另一个画笔 return hbr;} //加载按钮图片void CLhsButton::LoadBtnImg(LPCTSTR tType, UINT nNorID, UINT nHotID, UINT nDownID){ m_pImgNor = CQYUtility::LoadImgFromRes(_T("PNG"), nNorID); m_pImgHot = CQYUtility::LoadImgFromRes(_T("PNG"), nHotID); m_pImgDown = CQYUtility::LoadImgFromRes(_T("PNG"), nDownID); }
#ifndef _MEMDC_H_#define _MEMDC_H_ //////////////////////////////////////////////////// CMemDC - memory DC//class CMemDC : public CDC {private:		CBitmap		m_bitmap;		// Offscreen bitmap	CBitmap	m_oldBitmap;	// bitmap originally found in CMemDC	CDC		m_pDC;			// Saves CDC passed in constructor	CRect		m_rect;			// Rectangle of drawing area.	BOOL		m_bMemDC;		// TRUE if CDC really is a Memory DC.public:	   void Build( CDC pDC )   {        ASSERT(pDC != NULL);          m_pDC		= pDC;        m_oldBitmap = NULL;        m_bMemDC	= !pDC->IsPrinting();         if( m_bMemDC )		{            CreateCompatibleDC(pDC);            pDC->LPtoDP(&m_rect);             m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());            m_oldBitmap = SelectObject(&m_bitmap);                        SetMapMode(pDC->GetMapMode());            pDC->DPtoLP(&m_rect);            SetWindowOrg(m_rect.left, m_rect.top);        }		else		{            m_bPrinting = pDC->m_bPrinting;            m_hDC       = pDC->m_hDC;            m_hAttribDC = pDC->m_hAttribDC;        }         FillSolidRect( m_rect, pDC->GetBkColor() );    }		CMemDC(CDC pDC, const CRect pRect = NULL, BOOL bBg = FALSE) : CDC()	{		ASSERT(pDC != NULL);  		// Some initialization		m_pDC = pDC;		m_oldBitmap = NULL;		m_bMemDC = !pDC->IsPrinting(); 		// Get the rectangle to draw		if (pRect == NULL) {			pDC->GetClipBox(&m_rect);		} else {			m_rect = pRect;		} 		if (m_bMemDC) {			// Create a Memory DC			CreateCompatibleDC(pDC);			pDC->LPtoDP(&m_rect); 			m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());			m_oldBitmap = SelectObject(&m_bitmap); 			SetMapMode(pDC->GetMapMode()); 			SetWindowExt(pDC->GetWindowExt());			SetViewportExt(pDC->GetViewportExt()); 			pDC->DPtoLP(&m_rect);			SetWindowOrg(m_rect.left, m_rect.top);		} else {			// Make a copy of the relevent parts of the current DC for printing			m_bPrinting = pDC->m_bPrinting;			m_hDC       = pDC->m_hDC;			m_hAttribDC = pDC->m_hAttribDC;		} 		// Fill background 		if( bBg )			BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),				m_pDC, m_rect.left, m_rect.top, SRCCOPY);		else			FillSolidRect(m_rect, pDC->GetBkColor());	}		~CMemDC()		{				if (m_bMemDC) {			// Copy the offscreen bitmap onto the screen.			m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),				this, m_rect.left, m_rect.top, SRCCOPY);									//Swap back the original bitmap.			SelectObject(m_oldBitmap);				} else {			// All we need to do is replace the DC with an illegal value,			// this keeps us from accidently deleting the handles associated with			// the CDC that was passed to the constructor.						m_hDC = m_hAttribDC = NULL;		}		}		// Allow usage as a pointer		CMemDC operator->() 	{		return this;	}	 	// Allow usage as a pointer		operator CMemDC() 	{		return this;	}	   CMemDC( HDC hDC )	   : CDC()   {	   CDC::FromHandle( hDC )->GetClipBox( &m_rect );	   Build( CDC::FromHandle( hDC ) );   } }; #endifMFC中如何修改对话框中控件的TAB顺序1、选中对话框中的所有空间,然后按下快捷键Ctrl+D,然后在界面上就会显示当前这些控件的TAB顺序;2、按照想要的TAB顺序依次用鼠标点击界面上的控件,点击完成后,控件的TAB顺序就会变成鼠标的点击顺序。实现方法: 如果只需要控制控件,用方法一即可,但如果需要获取数据,则只能用方法二。我最终用的就是方法二.方法一: 首先查找MSDN关于CFileDialog扩展的实现描述,上网查到实现预览图片式的CFILEDIALOG的例子。按照其思路从CFileDialog派生了一个新的类CFileDialogEX.在类中添加以下代码#define WM_CHECKZOOMIN WM_USER+1856public:    BOOL bZoomIn;    UINT nMul; //[1~100] //前置声明---------------BOOL NEAR CALLBACK HandleNotify(HWND hDlg, LPOFNOTIFY pofn);UINT_PTR CALLBACK OFNHookProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);// CFileDialogExIMPLEMENT_DYNAMIC(CFileDialogEx, CFileDialog)CFileDialogEx::CFileDialogEx(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,        DWORD dwFlags, LPCTSTR lpszFilter, CWnd pParentWnd) :        CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd){    //这个四个常用标识位    m_ofn.Flags |=  OFN_ENABLETEMPLATE |OFN_HIDEREADONLY |OFN_EXPLORER;  //OFN_EXPLORER | OFN_ENABLEHOOK    m_ofn.lpstrTitle   =  _T("高级保存对话框");    m_ofn.hInstance = AfxGetInstanceHandle();    m_ofn.lpstrFilter  =  _T(".bmp\0.BMP\0所有文件 \0 .\0 ");    m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_FILEDIALOG_EX);    m_ofn.lpfnHook =  (LPOFNHOOKPROC)OFNHookProc;   } //Hook function for the Comm Dlg//在这里处理我们感兴趣的消息,想要哪个,截哪个!UINT_PTR CALLBACK OFNHookProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){    switch (uMsg)    {    case WM_INITDIALOG:   //初始化对话框上的控件        if(SendDlgItemMessage(hDlg, IDC_CHECK_ZOOMIN, BM_GETCHECK,0,0) == BST_UNCHECKED)        {                         ::EnableWindow(GetDlgItem(hDlg,IDC_EDIT_ZOOMNUM),FALSE);            ::EnableWindow(GetDlgItem(hDlg,IDC_SPIN_ZOOMNUM),FALSE);            ::SetWindowText(GetDlgItem(hDlg, IDC_EDIT_ZOOMNUM),_T("1"));            //ShowWindow(button,SW_HIDE);          }        break;    case WM_DESTROY:    //消毁对话框        {            LPOPENFILENAME lpOFN = (LPOPENFILENAME)GetWindowLong(hDlg, DWL_USER);        }        break;    case WM_COMMAND:   //这里处理,IDC_CHECK_ZOOMIN命令        {           if ((HIWORD(wParam) == BN_CLICKED) && (LOWORD(wParam) == IDC_CHECK_ZOOMIN))        {            BOOL bZoomIn = TRUE;            if(SendDlgItemMessage(hDlg, IDC_CHECK_ZOOMIN, BM_GETCHECK, 0, 0) == BST_CHECKED)            {                 bZoomIn = TRUE;                               ::EnableWindow(GetDlgItem(hDlg,IDC_EDIT_ZOOMNUM),TRUE);                ::EnableWindow(GetDlgItem(hDlg,IDC_SPIN_ZOOMNUM),TRUE);             }            else            {                bZoomIn = FALSE;                //::SetWindowText(GetDlgItem(hDlg, IDC_EDIT_ZOOMNUM),"");                ::EnableWindow(GetDlgItem(hDlg,IDC_EDIT_ZOOMNUM),FALSE);                ::EnableWindow(GetDlgItem(hDlg,IDC_SPIN_ZOOMNUM),FALSE);            }            HWND hParent = GetParent(hDlg);        // 注意hDlg是新加的模板对话框句柄,它是CFileDialog对话框的子部分,要获取CFileDialog对话框的句柄需要用GetParent函数             PostMessage(hParent,WM_CHECKZOOMIN,(WPARAM)bZoomIn,(LPARAM)0);            bZoomIn = FALSE;        }        break;    case WM_NOTIFY:        HandleNotify(hDlg, (LPOFNOTIFY)lParam);        break;    }    return 0;}//这里处理notify 消息BOOL NEAR CALLBACK HandleNotify(HWND hDlg, LPOFNOTIFY pofn){    CFileDialogEx dlg(TRUE);    switch (pofn->hdr.code)    {    case CDN_SELCHANGE:        {            //char szFile[MAX_PATH];            //// Get the path of the selected file.            //if (CommDlg_OpenSave_GetFilePath(GetParent(hDlg), szFile, sizeof(szFile)) <= sizeof(szFile))            //{            //    if(GetFileAttributes(szFile) !=  FILE_ATTRIBUTE_DIRECTORY)            //    {                       //        //Should we load the Pic            //        if(SendDlgItemMessage(hDlg, IDC_CHECK1, BM_GETCHECK,0,0) == BST_UNCHECKED)            //            dlg.ShowImagepreview(hDlg, szFile);               //    }            //}        }        break;    case CDN_FILEOK:        {                       int num;            GetDlgItemInt(hDlg,IDC_EDIT_ZOOMNUM,&num,FALSE);                       if(SendDlgItemMessage(hDlg, IDC_CHECK_ZOOMIN, BM_GETCHECK, 0, 0) == BST_CHECKED)            {                dlg.bZoomIn = TRUE;            }            else                dlg.bZoomIn = FALSE;            return FALSE;        }        break;    }    return(TRUE);}原计划从回调函数得到触发消息,然后用PostMessage的方式将自定义的WM_CHECKZOOMIN消息发给主窗口,在主窗口中更新我新加的变量bZoomIn和nMul的值。但调试发现我新定义的CFileDialogEX类中的WM_CHECKZOOMIN的消息响应函数总是无法进入。进一步调式确定消息确实是发送成功了,而且窗口句柄也没有错,但就是进入不了我定义的响应函数。  经过资料查询和思索初步推理: CFileDialog的消息处理是封闭的,自动的,在没有用钩子的情况下我们是无法将自己的消息函数插入其中并能自己处理的。 从MSDN给的说明也可以看出,它推荐PostMessage传输的也只是系统定义消息如WM_COMMAND,也就是说你可以控制它的控件做某项动作或显示隐藏控件,移动控件的位置。一切回到了原点,此路不通,继续寻找新的方法!!!!!! 方法二:看到一篇文章http://www.softist.com/programemo/cfiledialog/cfiledialog.htm,给我指了一条明路CFileDialog的个性化(VC++)本文是为标准的文件选择对话框添加控件以扩展它的功能。为了做到这点,要把CFileDialog类派生,还要准备粘贴控件用的对话框模板,把控件的消息响应入口追加到MESSAGE-MAP中。例程。文件选择对话框在选择文本文件时,可以预览这个文件的内容。1.生成对话框模板。作一个对话框的资源,比如ID为IDD_DIALOG1。其属性如下设定。IDD_DIALOG1 DIALOG DISCARDABLE  0, 0, 187, 128STYLE WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDRENFONT 9, "MS Sans Serif"BEGIN    LTEXT           "Static",stc32,7,7,173,114    EDITTEXT        IDC_EDIT_PREVIEW,7,18,102,30,ES_MULTILINE |                     ES_AUTOHSCROLL | ES_WANTRETURN    PUSHBUTTON      "Button1",IDC_BUTTON_PREVIEW,143,36,37,23END2.追加控件。首先追加一个ID为stc32的大一点的静态文字控件(Static)。然后在它的下面,追加预览用的多行编辑框(ID=IDC_EDIT_PREVIEW)和起动预览用的按钮(ID=IDC_BUTTON_PREVIEW)。3.生成CFileDialog的派生类,比如叫CFileDlg。为了指定资源ID,追加如下的代码到CFileDlg里。这个追加还有一个意义,那就是可以用MFC的类精灵工具(MFC ClassWizard)来作相应的处理。// Dialog Data    //{{AFX_DATA(CFileDlg)    enum { IDD = IDD_DIALOG1 };    //}}AFX_DATA4.把上面生成的对话框模板,安装到CFileDlg的类创建函数里,代码如下。CFileDlg::CFileDlg(BOOL bOpenFileDialog, ...) : CFileDialog(bOpenFileDialog, ...){    m_ofn.Flags |= dwFlags;    m_ofn.Flags |= OFN_EXPLORER;    m_ofn.Flags |= OFN_ENABLETEMPLATE;SetTemplate(0, IDD_DIALOG1);}5.填写按钮(ID=IDC_BUTTON_PREVIEW)的响应函数。从CFileDlg类的实体对话框取得文件的全路径,打开文件,把其内容显示在编辑框(ID=IDC_EDIT_PREVIEW)上。void CFileDlg::OnPreview(){    CString strPathName = GetPathName();    if (strPathName != "")    {        CFile file;        file.Open(strPathName, CFile::modeRead);        char buff[1024];        memset(buff, 0, 1024);        file.Read(buff, 1024);        GetDlgItem(IDC_EDIT_PREVIEW)->SetWindowText(buff);        file.Close();    }}6.结果测试。CFileDlg dlg(TRUE);dlg.DoModal(); 通过指定资源ID , 可以使用Wizard添加处理消息, OK 这正是我想要的, 按照它的方法,很快就实现了需求,调用如下//.h// Dialog Data//{{AFX_DATA(CFileDlg)enum { IDD = IDD_FILEDIALOG_EX };//}}AFX_DATApublic:    BOOL bZoomIn;    UINT nMul; //[1~100]afx_msg void OnBnClickedCheckZoomin();afx_msg void OnDeltaposSpinZoomnum(NMHDR pNMHDR, LRESULT pResult);virtual BOOL OnInitDialog();afx_msg void OnEnChangeEditZoomnum();afx_msg void OnEnKillfocusEditZoomnum(); //.cppCFileDialogEx::CFileDialogEx(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,        DWORD dwFlags, LPCTSTR lpszFilter, CWnd pParentWnd) :        CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd){    //这个四个常用标识位    m_ofn.Flags |=  OFN_ENABLETEMPLATE |OFN_HIDEREADONLY |OFN_EXPLORER;  //OFN_EXPLORER | OFN_ENABLEHOOK    m_ofn.lpstrTitle   =  _T("高级保存对话框");    m_ofn.hInstance = AfxGetInstanceHandle();    m_ofn.lpstrFilter  =  _T(".bmp\0.BMP\0所有文件 \0 .\0 ");    SetTemplate(0, IDD_FILEDIALOG_EX);} BEGIN_MESSAGE_MAP(CFileDialogEx, CFileDialog)    //ON_COMMAND()    ON_BN_CLICKED(IDC_CHECK_ZOOMIN, &CFileDialogEx::OnBnClickedCheckZoomin)    ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ZOOMNUM, &CFileDialogEx::OnDeltaposSpinZoomnum)    ON_EN_CHANGE(IDC_EDIT_ZOOMNUM, &CFileDialogEx::OnEnChangeEditZoomnum)    ON_EN_KILLFOCUS(IDC_EDIT_ZOOMNUM, &CFileDialogEx::OnEnKillfocusEditZoomnum)END_MESSAGE_MAP() void CFileDialogEx::OnBnClickedCheckZoomin(){    // TODO: 在此添加控件通知处理程序代码    bZoomIn = !bZoomIn;    GetDlgItem(IDC_EDIT_ZOOMNUM)->EnableWindow(bZoomIn);    GetDlgItem(IDC_SPIN_ZOOMNUM)->EnableWindow(bZoomIn);}void CFileDialogEx::OnDeltaposSpinZoomnum(NMHDR pNMHDR, LRESULT pResult){    LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);    // TODO: 在此添加控件通知处理程序代码    if (pNMUpDown->iDelta > 0)    {        if (nMul > 1)            nMul--;    }    else    {        if (nMul <= 100)            nMul++;    }    wchar_t buff[10];           _itow( nMul, buff, 10 );    LPCTSTR lpstr = (LPCTSTR)buff;    GetDlgItem(IDC_EDIT_ZOOMNUM)->SetWindowText(lpstr);    pResult = 0;}BOOL CFileDialogEx::OnInitDialog(){    CFileDialog::OnInitDialog();    // TODO:  在此添加额外的初始化    GetDlgItem(IDC_EDIT_ZOOMNUM)->EnableWindow(FALSE);    GetDlgItem(IDC_SPIN_ZOOMNUM)->EnableWindow(FALSE);    GetDlgItem(IDC_EDIT_ZOOMNUM)->SetWindowText(_T("1"));    bZoomIn = FALSE;    nMul = 1;    return TRUE;  // return TRUE unless you set the focus to a control    // 异常: OCX 属性页应返回 FALSE}void CFileDialogEx::OnEnChangeEditZoomnum(){    // TODO:  如果该控件是 RICHEDIT 控件,它将不    // 发送此通知,除非重写 CFileDialog::OnInitDialog()    // 函数并调用 CRichEditCtrl().SetEventMask(),    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。    // TODO:  在此添加控件通知处理程序代码    CString strText;    GetDlgItem(IDC_EDIT_ZOOMNUM)->GetWindowText(strText);    nMul = _wtoi(strText);    if ( (nMul < 1) || (nMul > 100) )    {        if (nMul < 1) nMul = 1;        if (nMul > 100) nMul = 100;        wchar_t buff[10];               _itow( nMul, buff, 10 );        LPCTSTR lpstr = (LPCTSTR)buff;        GetDlgItem(IDC_EDIT_ZOOMNUM)->SetWindowText(lpstr);    }}void CFileDialogEx::OnEnKillfocusEditZoomnum(){    // TODO: 在此添加控件通知处理程序代码    CString strText;    GetDlgItem(IDC_EDIT_ZOOMNUM)->GetWindowText(strText);    nMul = _wtoi(strText);   } // 调用实现代码CString szFilter1 = _T("保存图象文件(.bmp)|.bmp;|所有文件(.)|.||");CFileDialogEx dlg(FALSE, _T(".bmp"), NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter1);if (dlg.DoModal()==IDOK)        {            CComBSTR str=dlg.GetPathName();            if (!dlg.bZoomIn)            {                            }            else            {   float Magnification = dlg.nMul;}         }通常有需求mfc主对话框创建一个子对话框(弹出式的对话框),但是弹出对话框必须要隐藏起来,等需要显示的时候才显示。尝试过在创建弹出对话框后调用ShowWindow(SW_HIDE);函数实现,但是界面始终会闪烁一下。网上找到的许多资料都说在子对话框的OnInitDialog()函数中添加ShowWindow(SW_HIDE);函数,也有说在OnInitDialog()函数中使用MoveWindow();函数将对话框移动到显示屏的外面,但是最终效果都是不理想的, 会闪烁一下,下面提供一种解决办法,亲测有效:实现子对话的WM_WINDOWPOSCHANGING消息,其函数体头部afx_msg void OnWindowPosChanging(WINDOWPOS lpwndpos);在函数体中去掉显示属性即可:lpwndpos->flags &= ~SWP_SHOWWINDOW;在后续要显示对话时,加上显示属性即可:lpwndpos->flags &= SWP_SHOWWINDOW;特别注意:在关闭对话框前,比如实现OnOk();函数前需要去掉窗口的显示属性,否则对话框无法关闭。————————————————BOOL CTest6Dlg::OnInitDialog(){	CDialog::OnInitDialog();	WINDOWPLACEMENT wp;	wp.length=sizeof(WINDOWPLACEMENT);	wp.flags=WPF_RESTORETOMAXIMIZED;	wp.showCmd=SW_HIDE;	SetWindowPlacement(&wp);	return TRUE;}————————————————c#与C++类型转换,网摘2011-12-08 8:33//c++:HANDLE(void   )          ----    c#:System.IntPtr       //c++:Byte(unsigned   char)     ----    c#:System.Byte        //c++:SHORT(short)              ----    c#:System.Int16        //c++:WORD(unsigned   short)    ----    c#:System.UInt16        //c++:INT(int)                 ----    c#:System.Int16       //c++:INT(int)                  ----    c#:System.Int32        //c++:UINT(unsigned   int)      ----    c#:System.UInt16       //c++:UINT(unsigned   int)      ----    c#:System.UInt32       //c++:LONG(long)                ----    c#:System.Int32        //c++:ULONG(unsigned   long)    ----    c#:System.UInt32        //c++:DWORD(unsigned   long)    ----    c#:System.UInt32        //c++:DECIMAL                   ----    c#:System.Decimal        //c++:BOOL(long)                ----    c#:System.Boolean        //c++:CHAR(char)                ----    c#:System.Char        //c++:LPSTR(char   )           ----    c#:System.String        //c++:LPWSTR(wchar_t   )       ----    c#:System.String        //c++:LPCSTR(const   char   )  ----    c#:System.String        //c++:LPCWSTR(const   wchar_t   )      ----    c#:System.String        //c++:PCAHR(char   )   ----    c#:System.String        //c++:BSTR              ----    c#:System.String        //c++:FLOAT(float)      ----    c#:System.Single        //c++:DOUBLE(double)    ----    c#:System.Double        //c++:VARIANT           ----    c#:System.Object        //c++:PBYTE(byte   )   ----    c#:System.Byte[]        //c++:BSTR      ----    c#:StringBuilder       //c++:LPCTSTR   ----    c#:StringBuilder       //c++:LPCTSTR   ----    c#:string       //c++:LPTSTR    ----    c#:[MarshalAs(UnmanagedType.LPTStr)] string        //c++:LPTSTR 输出变量名    ----    c#:StringBuilder 输出变量名       //c++:LPCWSTR   ----    c#:IntPtr       //c++:BOOL      ----    c#:bool          //c++:HMODULE   ----    c#:IntPtr           //c++:HINSTANCE ----    c#:IntPtr        //c++:结构体    ----    c#:public struct 结构体{};        //c++:结构体 变量名   ----    c#:out 变量名  //C#中提前申明一个结构体实例化后的变量名       //c++:结构体 &变量名    ----    c#:ref 结构体 变量名                //c++:WORD      ----    c#:ushort       //c++:DWORD     ----    c#:uint       //c++:DWORD     ----    c#:int       //c++:UCHAR     ----    c#:int       //c++:UCHAR     ----    c#:byte       //c++:UCHAR    ----    c#:string       //c++:UCHAR    ----    c#:IntPtr       //c++:GUID      ----    c#:Guid       //c++:Handle    ----    c#:IntPtr       //c++:HWND      ----    c#:IntPtr       //c++:DWORD     ----    c#:int       //c++:COLORREF  ----    c#:uint       //c++:unsigned char     ----    c#:byte       //c++:unsigned char    ----    c#:ref byte       //c++:unsigned char    ----    c#:[MarshalAs(UnmanagedType.LPArray)] byte[]       //c++:unsigned char    ----    c#:[MarshalAs(UnmanagedType.LPArray)] Intptr       //c++:unsigned char &   ----    c#:ref byte       //c++:unsigned char 变量名      ----    c#:byte 变量名       //c++:unsigned short 变量名     ----    c#:ushort 变量名       //c++:unsigned int 变量名       ----    c#:uint 变量名       //c++:unsigned long 变量名      ----    c#:ulong 变量名       //c++:char 变量名       ----    c#:byte 变量名  //C++中一个字符用一个字节表示,C#中一个字符用两个字节表示       //c++:char 数组名[数组大小]     ----    c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst = 数组大小)]       public string 数组名; ushort       //c++:char             ----    c#:string      //传入参数       //c++:char             ----    c#:StringBuilder//传出参数       //c++:char 变量名      ----    c#:ref string 变量名       //c++:char 输入变量名  ----    c#:string 输入变量名       //c++:char 输出变量名  ----    c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 输出变量名       //c++:char            ----    c#:string       //c++:char 变量名     ----    c#:ref string 变量名       //c++:const char       ----    c#:string       //c++:char[]            ----    c#:string       //c++:char 变量名[数组大小]     ----    c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst=数组大小)] public string 变量名;    //c++:struct 结构体名 变量名   ----    c#:ref 结构体名 变量名       //c++:委托 变量名   ----    c#:委托 变量名       //c++:int       ----    c#:int       //c++:int       ----    c#:ref int       //c++:int &     ----    c#:ref int       //c++:int      ----    c#:ref int     //C#中调用前需定义int 变量名 = 0;       //c++:int      ----    c#:IntPtr       //c++:int32 PIPTR      ----    c#:int32[]       //c++:float PIPTR      ----    c#:float[]               //c++:double 数组名          ----    c#:ref double 数组名       //c++:double[] 数组名          ----    c#:ref double 数组名       //c++:long          ----    c#:int       //c++:ulong         ----    c#:int               //c++:UINT8        ----    c#:ref byte      //C#中调用前需定义byte 变量名 = new byte();               //c++:handle    ----    c#:IntPtr       //c++:hwnd      ----    c#:IntPtr                       //c++:void     ----    c#:IntPtr               //c++:void  user_obj_param    ----    c#:IntPtr user_obj_param       //c++:void  对象名称    ----    c#:([MarshalAs(UnmanagedType.AsAny)]Object 对象名称               //c++:char, INT8, SBYTE, CHAR                               ----    c#:System.SByte         //c++:short, short int, INT16, SHORT                        ----    c#:System.Int16         //c++:int, long, long int, INT32, LONG32, BOOL , INT        ----    c#:System.Int32         //c++:__int64, INT64, LONGLONG                              ----    c#:System.Int64         //c++:unsigned char, UINT8, UCHAR , BYTE                    ----    c#:System.Byte         //c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t             ----   c#:System.UInt16         //c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT      ----   c#:System.UInt32         //c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG                            ----   c#:System.UInt64         //c++:float, FLOAT                                                              ----   c#:System.Single         //c++:double, long double, DOUBLE                                               ----   c#:System.Double         //Win32 Types        ----  CLR Type                 //Struct需要在C#里重新定义一个Struct       //CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);       //unsigned char ppImage替换成IntPtr ppImage       //int& nWidth替换成ref int nWidth       //int, int&, 则都可用 ref int 对应       //双针指类型参数,可以用 ref IntPtr       //函数指针使用c++: typedef double (fun_type1)(double); 对应 c#:public delegate double fun_type1(double);       //char 的操作c++: char; 对应 c#:StringBuilder;       //c#中使用指针:在需要使用指针的地方 加 unsafe       //unsigned   char对应public   byte  
Visual Studio Ultimate 2013 KEY(密钥) : BWG7X-J98B3-W34RT-33B3R-JVYW9Visual Studio Premium 2013 KEY(密钥) : FBJVC-3CMTX-D8DVP-RTQCT-92494Visual Studio Professional 2013 KEY(密钥) : XDM3T-W3T3V-MGJWK-8BFVD-GVPKYTeam Foundation Server 2013 KEY(密钥) : MHG9J-HHHX9-WWPQP-D8T7H-7KCQG
* 声明:本文由其作者或媒体撰写,观点仅代表其本身,不代表本站立场。
编辑
HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com HappyLifeLife.com
 
<< < - > >>
[C++][*] [C][*] [po][*] [JS][*] [JAVA][*] [HIS][*] [Web][*] [H][*] [GIT][*] [Android][*] [DB][*] [0][*] [TL][*] [O][*] [3D][*] [PAS][*] [IOS][*] [算法][*] [地球][*] [学习方法][*] [探索][*] [宇宙][*] [Linux][*] [阅读秘诀][*] [考试技巧][*] [...]
天天快乐生活[HappyLifeLife.com]
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士
欢迎来访 快乐空间 热点新闻 我的分享 读书频道 七彩生活 精彩世界 快乐搜索 
ICP备15040518 | ©1999-2018 HappyLiveLife.com 版权所有 | 服务 | 爱新闻 | 爱分享 | 在线搜索 | 招贤纳士