WIN32++是封装了Win32API的C++项目。项目地址:/projects/win32-framework/files/?source=navbar。虽然名字是Win32,实际上32位和64位都是支持的。
Win32++实际上是Win32API的一个轻度封装,封装有点模仿MFC,但要轻量级很多。
前些日子群里有个朋友问CChart能不能在Win32++下使用,其实笨笨有点无语,在更复杂的环境下都可以,这里当然没有任何问题啊。当然,在陌生环境中,有可能遇到新的问题,因此笨笨就尝试了一下。
要使用这个库,首先当然是要正确安装Win32++了。到官网上下载最新的版本,笨笨下载的文件是Win32xx891.zip。把这个文件解压到合适的地方,再在Visual Studio的IDE中把其中的include和lib文件夹加入到编译环境就可以了。
第一步,建立一个Win32 Application的空工程LessonA51。
第二步,找到Win32xx的Tutorials目录,直接把里面第二个示例的main.cpp文件拷贝过来,并加入到LessonA51。
这个文件的内容不长,全部如下。
///// main.cpp// Note:// * Add the Win32++\include directory to project's additional include directories#include "wxx_wincore.h"//// CView is the application's main window.class CView : public CWnd{public:CView() {}virtual void OnDestroy() { PostQuitMessage(0); } // Ends the programvirtual ~CView() {}};// A class that inherits from CWinApp.// It is used to run the application's message loop.class CSimpleApp : public CWinApp{public:CSimpleApp() {}virtual ~CSimpleApp() {}virtual BOOL InitInstance();private:CView m_view;};// Called when the application starts.BOOL CSimpleApp::InitInstance(){// Create the Windowm_view.Create();return TRUE;}// WinMain is the program's entry point. The program starts here.int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int){// Start Win32++CSimpleApp theApp;// Run the applicationreturn theApp.Run();}
第三步,直接编译会出编译和链接错误,需要做一些修改。
解决编译错误,需要在C++的属性里面把运行时修改为多线程的,如Multithreaded,或Debug Multithreaded,都可以。
解决链接错误,需要在#include "wxx_wincore.h"这一句话后面,增加一行。
#pragma comment(lib, "comctl32.lib")
现在可以编译了,运行效果如下。
就是一个空窗口!
第四步,加入CChart的引用,并加入math.h的引用。
#include "Chart.h"#if defined(_UNICODE) || defined(UNICODE)#pragma comment(lib,"CChartu.lib")#else#pragma comment(lib,"CChart.lib")#endifusing namespace NsCChart;#include <math.h>
第五步,在CView类里面增加一个变量和一个函数。
CChartWnd chartWnd;virtual int OnCreate(CREATESTRUCT& cs);
这里OnCreate是Win32++已经内置的一个虚拟函数,我们重载一下就好了。这个函数的作用和MFC的OnCreate一样,但参数是CREATESTRUCT的引用,而不是指针。
第六步,实现OnCreate函数。
intCView::OnCreate(CREATESTRUCT& cs){chartWnd.Attach(GetHwnd());double pi = 4.0*atan(1.0);for(int i=0; i<360; ++i){chartWnd.GetChart()->AddPoint2D(i, 1.3*sin(i*2.0*pi/360.0));}chartWnd.GetChart()->SetTitle(_T("CChart和Win32++"));return 0;}
OK,好了,效果如图。
不过呢,目前还有两个问题。一是窗口不能响应鼠标双击消息,二是窗口大小调整时图像不能实时更新。下面就来逐一解决。
第七步,在CView类中重载PreRegisterClass函数,解决鼠标双击问题。
virtual void PreRegisterClass(WNDCLASS& wc){wc.style |= CS_DBLCLKS;}
运行一下,似乎没有效果,什么原因呢?
其实,这是Win32++库本身的Bug,毕竟这个库就是个人作品,不能和MFC那样成熟的商业产品相比,要求不要太高了哇!
打开打开Win32++库include文件夹下wxx_wincore.h文件,找到CWnd::CreateEx函数,并找到if (RegisterClass(wc) == 0)这一行,在其前面添加这样一句话。
PreRegisterClass(wc);
这样修改Win32++库以后,鼠标双击完全没有问题了。
第八步,解决窗口大小调整重绘的问题。
在MFC中,这直接可以在OnSize中处理,检查了一遍Win32++的源码,发现其并没有提供OnSize函数。怎么办呢?
别慌,我们还有终极大招!Win32++提供了窗口函数的重载。
在CView类中增加一个成员函数。
virtual LRESULT WndProc(UINT msg, WPARAM wparam, LPARAM lparam);
实现这个成员函数就很简单了。
LRESULT CView::WndProc(UINT msg, WPARAM wparam, LPARAM lparam){if(msg == WM_SIZE){chartWnd.ReDraw();}return CWnd::WndProc(msg, wparam, lparam);}
现在功能完全正常!!!