//GetSonicUI是引擎导出的唯一函数,是类厂和引擎总控,负责创建对象和销毁对象等。ISonicImage * pImg = GetSonicUI()->CreateImage();pImg->Load("C:\\1.png");pImg->Draw(hdc, 10, 10);GetSonicUI()->DestroyObject(pImg);OK,一个带透明通道的png图片绘制就完成了,是不是轻松惬意。
ISonicString * pStr = GetSonicUI()->CreateString();pStr->Format("/c=%x, a='http://hi.csdn.net/zskof', font, font_height=16/点我打开链接", RGB(0, 0, 255));LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){PAINTSTRUCT ps;HDC hdc;switch (message){case WM_PAINT:{hdc = BeginPaint(hWnd, &ps);pStr->TextOut(hdc, 0, 0, hWnd);EndPaint(hWnd, &ps);}break;}...}如何,只需要创建,然后像CString的Format一样格式化一个字符串,在WM_PAINT响应中输出即可,只需要三步,你就得到了一行蓝色的功能完整的超链接,是不是很方便。通过控制字符,你还可以设定下划线的样式,鼠标形状,响应鼠标时变色等细节,具体参看ISonicUI.h中的注释即可。
ISonicImage * pImg = GetSonicUI()->CreateImage();pImg->Load("C:\\1.png");ISonicString * pStr = GetSonicUI()->CreateString();pStr->Format("/c=%x/你好吗,朋友/p=%d, a='http://hi.csdn.net/zskof'/", RGB(0, 0, 255), pImg->GetObjectId());这样就可以像写网页一样在你的界面上进行文字和图片的混合排版输出了。
void WINAPI OnMove(ISonicString * pStr, LPVOID){g_pEffect->MoveGently(0, 0);}// 加载三态图片资源ISonicImage * pImgNormal = GetSonicUI()->CreateImage();pImgNormal->Load(BMP_NORMAL);pImgNormal->SetColorKey(RGB(255, 0, 255));ISonicImage * pImgHover = GetSonicUI()->CreateImage();pImgHover->Load(BMP_HOVER);pImgHover->SetColorKey(RGB(255, 0, 255));ISonicImage * pImgClick = GetSonicUI()->CreateImage();pImgClick->Load(BMP_CLICK);pImgClick->SetColorKey(RGB(255, 0, 255));// ISonicString * g_pTest[10]g_pTest[10]->Format("/a, p=%d, ph=%d, pc=%d, linkt='点我移动'/", pImgNormal->GetObjectId(), pImgHover->GetObjectId(),pImgClick->GetObjectId());g_pTest[10]->Delegate(DELEGATE_EVENT_CLICK, NULL, NULL, OnMove);同样的,格式化好后的ISonicString在OnPaint的时候输出即可,这样你就拥有一个具有三态变换的漂亮按钮,其中'p'关键字代表normal态,'ph'代表hover态,'pc'代表click态。如果从美工那里得到的源图是一张图片三态平铺的也不要紧,只需要将ph,pc都指向同一张img即可,内部会自动进行源区域裁剪。另外用过QQ2009的人可能会发现,2009的很多按钮三态变换是渐变的,体验很好,ISonicString一样可以做,只需要格式化时稍稍修改一下,
g_pTest[10]->Format("/a, p=%d, ph=%d, pc=%d, linkt='点我移动', animation=40/", pImgNormal->GetObjectId(),pImgHover->GetObjectId(), pImgClick->GetObjectId());增加一个'animation=40'的控制符(40是渐变速度),就可以得到一个QQ2009一样漂亮的三态渐变按钮了。按钮的点击响应是用“委托”的方式,你需要向按钮委托一个形如void WINAPI Func(ISonicBase *, LPVOID)的全局函数或类的成员函数,以供引擎在按钮被点击时回调。
ISonicPaint * pPaint = GetSonicUI()->CreatePaint();pPaint->Create(FALSE/*是否需要memDC*/, m_rtString.Width()/*宽*/, m_rtString.Height()/*高*/);画布创建之后,只需要在WM_PAINT中调用画面的Draw方法即可,很简单。如果你想在这个画布上做画,就需要像自绘按钮一样,向画布委托一个你自己的绘制过程,以便在每次重绘时调用。示例代码如下:
class CTest{public:void RenderImage(ISonicPaint * pPaint, LPVOID);};void CTest::RenderImage(ISonicPaint * pPaint, LPVOID){if(pPaint->GetCurrentPaint() == NULL){return;}HDC hdc = pPaint->GetCurrentPaint()->hdc;int x = pPaint->GetCurrentPaint()->x;int y = pPaint->GetCurrentPaint()->y;// draw here...}CTest test;pPaint->Delegate(DELEGATE_EVENT_PAINT, NULL, &test, CSonicString::RenderImage);如此每次只需要调用pPaint->Redraw()便会进行画布的区域重绘。这里需要说明的是,ISonicString,包括接下来要介绍的几个对象都是基于画布的,也就是说引擎的所有对象都是具有脏处理检查和区域自绘制优化的,可以极大的提高运行效率。
...// ISonicImage * pImgSetWindowRgn(hWnd, pImg->CreateRgn());方法2:
...// ISonicImage * pImg// ISonicWndEffect * pEffectpEffect->Attach(hWnd, TRUE); // 使用像素级alpha模式attachpEffect->SetShapeByImage(pImg);
联系客服