找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 7163|回复: 9

【C】用C语言实现的VB的PictureBox

[复制链接]
发表于 2015-7-15 02:50:18 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
作者:0xAA55
来源:http://www.0xaa55.com/thread-1417-1-1.html
转载请注明出处。
20150715024442.png
如图所示。这并不和VB的完全一样。它能显示图片,以及拉伸显示图片,除此以外,还能开启“自动重绘”模式。在自动重绘模式下用户需要通过调用函数取得hDC进行绘图操作。这样这东西就内置了一个画板。
头文件的代码:
  1. #ifndef _PictureBoxHeader_
  2. #define _PictureBoxHeader_

  3. #include<Windows.h>

  4. //PictureBox的额外属性结构
  5. //读取方式:(PicBoxAttr_p)GetWindowLong(hPicBox,GWL_USERDATA);
  6. typedef struct
  7. {
  8.         DWORD                dwSign;                //签名
  9.         HINSTANCE        hInst;                //实例句柄
  10.         HWND                hWnd;                //窗口句柄
  11.         HBRUSH                BkBrush;        //背景色
  12.         HDC                        hCtlDC;                //控件HDC

  13.         HDC                        hPicDC;                //图像HDC
  14.         HBITMAP                hPicBmp;        //图像
  15.         LONG                lPicW;                //图像宽度
  16.         LONG                lPicH;                //图像高度

  17.         HDC                        hImgDC;                //后台图像HDC
  18.         HBITMAP                hImgBmp;        //后台图像
  19.         void                *pImgBits;        //后台图像位图数据
  20.         LONG                lImgW;                //后台图像宽度
  21.         LONG                lImgH;                //后台图像镐度

  22.         BOOL                bStretch;        //是否拉伸
  23.         BOOL                bAutoRedraw;//是否自动重绘
  24. }PicBoxAttr_t,*PicBoxAttr_p;

  25. //注册PictureBox窗口类
  26. ATOM WINAPI RegisterPictureBox();

  27. //创建PictureBox控件
  28. HWND WINAPI CreatePictureBox(int x,int y,int w,int h,HWND hParent,WORD ID);

  29. //加载PictureBox的图像
  30. BOOL WINAPI LoadPicture(HWND hWnd,TCHAR*szPicFile);

  31. //判断是否为PictureBox控件
  32. BOOL WINAPI IsPictureBox(HWND hWnd);

  33. //设置PictureBox控件是否拉伸图像
  34. void WINAPI SetPicBoxStretchMode(HWND hWnd,BOOL bStretch);

  35. //设置PictureBox控件是否自动重绘
  36. void WINAPI SetPicBoxAutoRedrawMode(HWND hWnd,BOOL bAutoRedraw);

  37. //取得PictureBox的绘图句柄
  38. HDC WINAPI GetPicBoxHDC(HWND hWnd);

  39. //显示PictureBox的图像
  40. void WINAPI RefreshPicBox(HWND hWnd);

  41. //设置PictureBox的边框样式
  42. void WINAPI SetPicBoxBorderMode(HWND hWnd,BOOL bShowBorder);

  43. //清屏
  44. void WINAPI ClearPicBoxImage(HWND hWnd);

  45. //删除图片框的图片
  46. void WINAPI DeletePicBoxPicture(HWND hWnd);

  47. #endif // !_PictureBoxHeader_
复制代码
实现部分的代码:
  1. #include"picbox.h"

  2. static ATOM g_ClassAtom=0;
  3. const TCHAR g_szPicBoxClass[]=TEXT("PictureBox");

  4. const DWORD        PicBoxSign=0x091C7B08;

  5. #define        CalcPitch(w,b)        ((((w)*(b)-1)/32+1)*4)

  6. //=============================================================================
  7. //函数:CreatePicBoxAttr
  8. //描述:创建PictureBox属性块
  9. //-----------------------------------------------------------------------------
  10. static
  11. PicBoxAttr_p CreatePicBoxAttr(HWND hWnd)
  12. {
  13.         PicBoxAttr_p pAttr=(PicBoxAttr_p)malloc(sizeof(PicBoxAttr_t));
  14.         if(pAttr)
  15.         {
  16.                 memset(pAttr,0,sizeof(PicBoxAttr_t));

  17.                 pAttr->dwSign=PicBoxSign;
  18.                 pAttr->hInst=GetModuleHandle(NULL);
  19.                 pAttr->hWnd=hWnd;
  20.                 pAttr->BkBrush=(HBRUSH)(COLOR_BTNFACE+1);
  21.                 pAttr->hCtlDC=GetWindowDC(hWnd);
  22.         }

  23.         return pAttr;
  24. }

  25. //=============================================================================
  26. //函数:DeletePicBoxAttr
  27. //描述:删除PictureBox属性块
  28. //-----------------------------------------------------------------------------
  29. static
  30. void DeletePicBoxAttr(PicBoxAttr_p pAttr)
  31. {
  32.         if(pAttr)
  33.         {
  34.                 //释放控件HDC
  35.                 if(pAttr->hCtlDC)
  36.                         ReleaseDC(pAttr->hWnd,pAttr->hCtlDC);
  37.                
  38.                 //删除图像
  39.                 if(pAttr->hPicBmp)DeleteObject(pAttr->hPicBmp);
  40.                 if(pAttr->hPicDC)DeleteDC(pAttr->hPicDC);

  41.                 //删除后台图像
  42.                 if(pAttr->hImgBmp)DeleteObject(pAttr->hImgBmp);
  43.                 if(pAttr->hImgDC)DeleteDC(pAttr->hImgDC);

  44.                 //释放内存
  45.                 free(pAttr);
  46.         }
  47. }

  48. //=============================================================================
  49. //函数:SetupPicBoxImage
  50. //描述:重置PictureBox的后台图像
  51. //-----------------------------------------------------------------------------
  52. static
  53. BOOL SetupPicBoxImage(PicBoxAttr_p pAttr)
  54. {
  55.         RECT rc;
  56.         BITMAPINFOHEADER BMIF;
  57.         HDC hWindowDC;
  58.         HDC hNewDC=NULL;
  59.         HBITMAP hNewBMP=NULL;
  60.         void*pBits;

  61.         //创建一个新的HDC和HBITMAP
  62.         hWindowDC=GetWindowDC(pAttr->hWnd);
  63.         hNewDC=CreateCompatibleDC(hWindowDC);
  64.         ReleaseDC(pAttr->hWnd,hWindowDC);
  65.         if(!hNewDC)
  66.                 return FALSE;

  67.         GetClientRect(pAttr->hWnd,&rc);
  68.         BMIF.biSize=sizeof(BMIF);
  69.         BMIF.biWidth=rc.right-rc.left;
  70.         BMIF.biHeight=rc.bottom-rc.top;
  71.         BMIF.biPlanes=1;
  72.         BMIF.biBitCount=24;
  73.         BMIF.biCompression=0;
  74.         BMIF.biSizeImage=CalcPitch(BMIF.biWidth,BMIF.biBitCount)*BMIF.biHeight;
  75.         BMIF.biXPelsPerMeter=0;
  76.         BMIF.biYPelsPerMeter=0;
  77.         BMIF.biClrUsed=0;
  78.         BMIF.biClrImportant=0;
  79.         hNewBMP=CreateDIBSection(hNewDC,(BITMAPINFO*)&BMIF,DIB_PAL_COLORS,&pBits,
  80.                 NULL,0);
  81.         if(!hNewBMP)
  82.                 goto Failed;
  83.         SelectObject(hNewDC,hNewBMP);

  84.         //填充为背景色,然后搬运旧的后台图像
  85.         FillRect(hNewDC,&rc,pAttr->BkBrush);
  86.         if(pAttr->hImgDC)
  87.         {
  88.                 BitBlt(hNewDC,0,0,pAttr->lImgW,pAttr->lImgH,pAttr->hImgDC,0,0,SRCCOPY);
  89.                 DeleteDC(pAttr->hImgDC);
  90.         }
  91.         else if(pAttr->hPicDC)
  92.                 BitBlt(hNewDC,0,0,pAttr->lPicW,pAttr->lPicH,pAttr->hPicDC,0,0,SRCCOPY);

  93.         if(pAttr->hImgBmp)
  94.                 DeleteObject(pAttr->hImgBmp);

  95.         //替换为新的后台图像
  96.         pAttr->lImgW=BMIF.biWidth;
  97.         pAttr->lImgH=BMIF.biHeight;
  98.         pAttr->hImgBmp=hNewBMP;
  99.         pAttr->hImgDC=hNewDC;
  100.         pAttr->pImgBits=pBits;

  101.         return TRUE;
  102. Failed:
  103.         if(hNewBMP)
  104.                 DeleteObject(hNewBMP);
  105.         if(hNewDC)
  106.                 DeleteDC(hNewDC);
  107.         return FALSE;
  108. }

  109. //=============================================================================
  110. //函数:LoadPicture
  111. //描述:加载PictureBox的图像
  112. //-----------------------------------------------------------------------------
  113. BOOL WINAPI LoadPicture(HWND hWnd,TCHAR*szPicFile)
  114. {
  115.         PicBoxAttr_p pAttr;
  116.         BITMAP bmp;

  117.         if(IsPictureBox(hWnd))
  118.                 pAttr=(PicBoxAttr_p)GetWindowLongPtr(hWnd,GWL_USERDATA);
  119.         else
  120.                 return FALSE;

  121.         //创建HDC,然后清除之前加载过的图像
  122.         if(!pAttr->hPicDC)
  123.         {
  124.                 HDC hDC=GetWindowDC(hWnd);
  125.                 pAttr->hPicDC=CreateCompatibleDC(hDC);
  126.                 ReleaseDC(hWnd,hDC);
  127.         }
  128.         if(pAttr->hPicBmp)
  129.                 DeleteObject(pAttr->hPicBmp);

  130.         //加载图像
  131.         pAttr->hPicBmp=(HBITMAP)LoadImage(pAttr->hInst,szPicFile,IMAGE_BITMAP,0,0,
  132.                 LR_LOADFROMFILE|LR_CREATEDIBSECTION);
  133.         if(!pAttr->hPicBmp)
  134.                 return FALSE;
  135.         SelectObject(pAttr->hPicDC,pAttr->hPicBmp);

  136.         GetObject(pAttr->hPicBmp,sizeof(bmp),&bmp);
  137.         pAttr->lPicW=bmp.bmWidth;
  138.         pAttr->lPicH=bmp.bmHeight;

  139.         RefreshPicBox(hWnd);
  140.         return TRUE;
  141. }

  142. //=============================================================================
  143. //函数:RefreshPicBox
  144. //描述:显示PictureBox的图像
  145. //-----------------------------------------------------------------------------
  146. void WINAPI RefreshPicBox(HWND hWnd)
  147. {
  148.         RECT rc;
  149.         GetClientRect(hWnd,&rc);
  150.         InvalidateRect(hWnd,&rc,TRUE);
  151. }

  152. //=============================================================================
  153. //函数:PicBoxWndProc
  154. //描述:PictureBox的消息处理函数
  155. //-----------------------------------------------------------------------------
  156. static
  157. LRESULT CALLBACK PicBoxWndProc(HWND hWnd,UINT Msg,WPARAM wp,LPARAM lp)
  158. {
  159.         PicBoxAttr_p pAttr=NULL;
  160.         switch(Msg)
  161.         {
  162.         case WM_CREATE:
  163.                 pAttr=CreatePicBoxAttr(hWnd);
  164.                 if(pAttr)
  165.                         SetWindowLongPtr(hWnd,GWL_USERDATA,(LONG_PTR)pAttr);
  166.                 else
  167.                         return-1;
  168.                 break;
  169.         case WM_COMMAND:
  170.                 hWnd=GetParent(hWnd);
  171.                 if(hWnd)
  172.                         return SendMessage(hWnd,Msg,wp,lp);
  173.                 break;
  174.         case WM_PAINT:
  175.                 pAttr=(PicBoxAttr_p)GetWindowLong(hWnd,GWL_USERDATA);
  176.                 if(pAttr)
  177.                 {
  178.                         PAINTSTRUCT ps;
  179.                         HDC hDC;
  180.                         hDC=BeginPaint(hWnd,&ps);
  181.                         if(pAttr->bAutoRedraw)//自动重绘的话,绘制后台图像
  182.                         {
  183.                                 if(!pAttr->hImgDC || !pAttr->hImgBmp)
  184.                                         SetupPicBoxImage(pAttr);
  185.                                 BitBlt(hDC,0,0,pAttr->lImgW,pAttr->lImgH,
  186.                                 pAttr->hImgDC,0,0,SRCCOPY);
  187.                         }
  188.                         else//否则绘制图像
  189.                         {
  190.                                 RECT rc;
  191.                                 GetClientRect(hWnd,&rc);
  192.                                 if(pAttr->bStretch)
  193.                                 {
  194.                                         SetStretchBltMode(hDC,HALFTONE);
  195.                                         StretchBlt(hDC,
  196.                                                 rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,
  197.                                                 pAttr->hPicDC,
  198.                                                 0,0,pAttr->lPicW,pAttr->lPicH,SRCCOPY);
  199.                                 }
  200.                                 else
  201.                                         BitBlt(hDC,rc.left,rc.top,pAttr->lPicW,pAttr->lPicH,
  202.                                                 pAttr->hPicDC,0,0,SRCCOPY);
  203.                         }
  204.                         EndPaint(hWnd,&ps);
  205.                 }
  206.                 break;
  207.         case WM_DESTROY:
  208.                 pAttr=(PicBoxAttr_p)GetWindowLongPtr(hWnd,GWL_USERDATA);
  209.                 if(pAttr)
  210.                         DeletePicBoxAttr(pAttr);
  211.                 SetWindowLongPtr(hWnd,GWL_USERDATA,0);
  212.                 break;
  213.         default:
  214.                 return DefWindowProc(hWnd,Msg,wp,lp);
  215.         }
  216.         return 0;
  217. }

  218. //=============================================================================
  219. //函数:RegisterPictureBox
  220. //描述:注册PictureBox窗口类
  221. //-----------------------------------------------------------------------------
  222. ATOM WINAPI RegisterPictureBox()
  223. {
  224.         WNDCLASSEX WCEx=
  225.         {
  226.                 sizeof(WNDCLASSEX),
  227.                 0,
  228.                 PicBoxWndProc,
  229.                 0,
  230.                 0,
  231.                 GetModuleHandle(NULL),
  232.                 NULL,
  233.                 LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW)),
  234.                 (HBRUSH)(COLOR_BTNFACE+1),
  235.                 NULL,
  236.                 g_szPicBoxClass,
  237.                 NULL
  238.         };
  239.         return g_ClassAtom=RegisterClassEx(&WCEx);
  240. }

  241. //=============================================================================
  242. //函数:CreatePictureBox
  243. //描述:创建PictureBox控件
  244. //-----------------------------------------------------------------------------
  245. HWND WINAPI CreatePictureBox(int x,int y,int w,int h,HWND hParent,WORD ID)
  246. {
  247.         return CreateWindowEx(0,MAKEINTATOM(g_ClassAtom),NULL,
  248.                 WS_CHILD|WS_VISIBLE|WS_BORDER,x,y,w,h,
  249.                 hParent,(HMENU)ID,GetModuleHandle(NULL),NULL);
  250. }

  251. //=============================================================================
  252. //函数:IsPictureBox
  253. //描述:判断是否为PictureBox控件
  254. //-----------------------------------------------------------------------------
  255. BOOL WINAPI IsPictureBox(HWND hWnd)
  256. {
  257. #        define nPicBox (sizeof(g_szPicBoxClass)/sizeof(TCHAR)-1)
  258.         TCHAR szPicBoxClass[nPicBox+2];

  259.         //首先判断窗口类
  260.         if(GetClassName(hWnd,szPicBoxClass,nPicBox+2) == nPicBox)
  261.         {
  262.                 if(!lstrcmp(szPicBoxClass,g_szPicBoxClass))
  263.                 {
  264.                         //然后判断附加信息
  265.                         PicBoxAttr_p pAttr
  266.                                 =(PicBoxAttr_p)GetWindowLong(hWnd,GWL_USERDATA);
  267.                         if(!IsBadReadPtr(pAttr,sizeof(PicBoxAttr_t)))
  268.                         {
  269.                                 if(pAttr->dwSign==PicBoxSign)
  270.                                         return TRUE;
  271.                         }
  272.                 }
  273.         }
  274.        
  275.         return FALSE;
  276. #        undef nPicBox
  277. }

  278. //=============================================================================
  279. //函数:SetPicBoxStretchMode
  280. //描述:设置PictureBox控件是否拉伸图像
  281. //-----------------------------------------------------------------------------
  282. void WINAPI SetPicBoxStretchMode(HWND hWnd,BOOL bStretch)
  283. {
  284.         if(IsPictureBox(hWnd))
  285.         {
  286.                 PicBoxAttr_p pAttr;
  287.                 pAttr=(PicBoxAttr_p)GetWindowLong(hWnd,GWL_USERDATA);
  288.                 pAttr->bStretch=bStretch;

  289.                 //强制重绘
  290.                 RefreshPicBox(hWnd);
  291.         }
  292. }

  293. //=============================================================================
  294. //函数:SetPicBoxAutoRedrawMode
  295. //描述:设置PictureBox控件是否自动重绘
  296. //-----------------------------------------------------------------------------
  297. void WINAPI SetPicBoxAutoRedrawMode(HWND hWnd,BOOL bAutoRedraw)
  298. {
  299.         if(IsPictureBox(hWnd))
  300.         {
  301.                 PicBoxAttr_p pAttr=(PicBoxAttr_p)GetWindowLong(hWnd,GWL_USERDATA);
  302.                 pAttr->bAutoRedraw=bAutoRedraw;
  303.                 if(bAutoRedraw)
  304.                         SetupPicBoxImage(pAttr);
  305.         }
  306. }

  307. //=============================================================================
  308. //函数:GetPicBoxHDC
  309. //描述:取得PictureBox的绘图句柄
  310. //-----------------------------------------------------------------------------
  311. HDC WINAPI GetPicBoxHDC(HWND hWnd)
  312. {
  313.         if(IsPictureBox(hWnd))
  314.         {
  315.                 PicBoxAttr_p pAttr=(PicBoxAttr_p)GetWindowLong(hWnd,GWL_USERDATA);
  316.                 if(pAttr->bAutoRedraw)
  317.                         return pAttr->hImgDC;
  318.                 else
  319.                         return pAttr->hCtlDC;
  320.         }
  321.         return NULL;
  322. }

  323. //=============================================================================
  324. //函数:SetPicBoxBorderMode
  325. //描述:设置PictureBox的边框样式
  326. //-----------------------------------------------------------------------------
  327. void WINAPI SetPicBoxBorderMode(HWND hWnd,BOOL bShowBorder)
  328. {
  329.         if(IsPictureBox(hWnd))
  330.         {
  331.                 if(bShowBorder)
  332.                         SetWindowLong(hWnd,GWL_STYLE,GetWindowLong(hWnd,GWL_STYLE)|WS_BORDER);
  333.                 else
  334.                         SetWindowLong(hWnd,GWL_STYLE,GetWindowLong(hWnd,GWL_STYLE)&~WS_BORDER);
  335.                 RefreshPicBox(hWnd);
  336.         }
  337. }

  338. //=============================================================================
  339. //函数:ClearPicBoxImage
  340. //描述:清屏
  341. //-----------------------------------------------------------------------------
  342. void WINAPI ClearPicBoxImage(HWND hWnd)
  343. {
  344.         if(IsPictureBox(hWnd))
  345.         {
  346.                 PicBoxAttr_p pAttr=(PicBoxAttr_p)GetWindowLong(hWnd,GWL_USERDATA);
  347.                 if(pAttr->bAutoRedraw && pAttr->hImgDC)
  348.                 {
  349.                         RECT rc;
  350.                         GetClientRect(hWnd,&rc);
  351.                         FillRect(pAttr->hImgDC,&rc,pAttr->BkBrush);
  352.                         if(pAttr->hPicDC && pAttr->hPicBmp)
  353.                                 BitBlt(pAttr->hImgDC,0,0,pAttr->lPicW,pAttr->lPicH,
  354.                                         pAttr->hPicDC,0,0,SRCCOPY);
  355.                 }
  356.                 RefreshPicBox(hWnd);
  357.         }
  358. }

  359. //=============================================================================
  360. //函数:DeletePicBoxPicture
  361. //描述:删除图片框的图片
  362. //-----------------------------------------------------------------------------
  363. void WINAPI DeletePicBoxPicture(HWND hWnd)
  364. {
  365.         if(IsPictureBox(hWnd))
  366.         {
  367.                 PicBoxAttr_p pAttr=(PicBoxAttr_p)GetWindowLong(hWnd,GWL_USERDATA);
  368.                 if(pAttr->bAutoRedraw)
  369.                 {
  370.                         RECT rc;
  371.                         GetClientRect(hWnd,&rc);
  372.                         FillRect(pAttr->hImgDC,&rc,pAttr->BkBrush);
  373.                 }
  374.                 DeleteObject(pAttr->hPicBmp);pAttr->hPicBmp=NULL;
  375.                 DeleteDC(pAttr->hPicDC);pAttr->hPicDC=NULL;
  376.                 RefreshPicBox(hWnd);
  377.         }
  378. }
复制代码
引用的例子:
  1. #include<Windows.h>

  2. #include"picbox.h"

  3. LRESULT CALLBACK WndProc(HWND hWnd,UINT Msg,WPARAM wp,LPARAM lp)
  4. {
  5.         switch(Msg)
  6.         {
  7.         default:
  8.                 return DefWindowProc(hWnd,Msg,wp,lp);
  9.         case WM_CREATE:
  10.                 RegisterPictureBox();
  11.                 do
  12.                 {
  13.                         HWND hPicBox1,hPicBox2;

  14.                         hPicBox1=CreatePictureBox(0,0,300,300,hWnd,1);
  15.                         LoadPicture(hPicBox1,TEXT("tex1.bmp"));

  16.                         hPicBox2=CreatePictureBox(300,0,400,400,hWnd,1);
  17.                         LoadPicture(hPicBox2,TEXT("tex1.bmp"));
  18.                         SetPicBoxStretchMode(hPicBox2,TRUE);
  19.                 }while(0);
  20.                 break;
  21.         case WM_DESTROY:
  22.                 PostQuitMessage(0);
  23.                 break;
  24.         }
  25.         return 0;
  26. }

  27. int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szCmd,int nCmd)
  28. {
  29.         WNDCLASSEX WCEx={sizeof(WNDCLASSEX),0,WndProc,0,0,hInst,LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION)),LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW)),(HBRUSH)COLOR_BTNFACE,NULL,TEXT("tutpicbox"),NULL};//窗口类
  30.         MSG msg;
  31.         HWND hWnd=CreateWindowEx(0,MAKEINTATOM(RegisterClassEx(&WCEx)),TEXT("tutpicbox"),WS_OVERLAPPEDWINDOW,
  32.                 CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);//窗口句柄
  33.         ShowWindow(hWnd,nCmd);
  34.         UpdateWindow(hWnd);
  35.         while(GetMessage(&msg,NULL,0,0))//消息循环
  36.         {
  37.                 TranslateMessage(&msg);
  38.                 DispatchMessage(&msg);
  39.         }
  40.         return msg.wParam;
  41. }
复制代码
BIN: picboxbin.7z (20.59 KB, 下载次数: 8)
SRC: tutpicbox.7z (25.49 KB, 下载次数: 24)

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2015-7-15 03:01:55 | 显示全部楼层
这么复杂的玩意 我要怎么结合到A5UI里呢!!!
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2015-7-15 03:05:46 | 显示全部楼层
美俪女神 发表于 2015-7-15 03:01
这么复杂的玩意 我要怎么结合到A5UI里呢!!!

这其实就是一个自制控件而已。
回复 赞! 靠!

使用道具 举报

发表于 2015-7-15 22:24:14 | 显示全部楼层
可以转载么?
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2015-7-15 23:05:14 | 显示全部楼层

可以。请注明作者和原网址。
回复 赞! 靠!

使用道具 举报

发表于 2015-7-15 23:28:33 | 显示全部楼层
0xAA55 发表于 2015-7-15 23:05
可以。请注明作者和原网址。

嗯嗯 ,了解。
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2015-7-18 00:47:09 | 显示全部楼层
已更新:
添加删除图片、清屏等功能。
修复窗口类判断不严谨的漏洞。
回复 赞! 靠!

使用道具 举报

发表于 2015-7-20 17:15:25 | 显示全部楼层
很方便的模板 thx
回复 赞! 靠!

使用道具 举报

发表于 2017-10-25 02:13:20 | 显示全部楼层
有什么好处啊?
回复 赞! 靠!

使用道具 举报

发表于 2017-10-25 02:22:38 | 显示全部楼层
可以提高重绘速度吗
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 07:10 , Processed in 0.043798 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表