日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Win32 鼠标绘图代码研究

發布時間:2025/4/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Win32 鼠标绘图代码研究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://download.csdn.net/detail/u012313945/9534690

下面摘錄繪圖部分代碼以供研究;winmain和相關窗口過程函數參閱相關資料;


#include<windows.h> #include "resource.h" #include"func.h" #include <stdio.h> #include <math.h> void DrawMyLine(HDC hdc, PMYPIC pLine) // 繪制一條線 {HPEN hPen = CreatePenIndirect(&(pLine->logpen));HPEN hPenOld = (HPEN)SelectObject(hdc, hPen);MoveToEx(hdc, pLine->ptS.x, pLine->ptS.y, NULL);LineTo(hdc, pLine->ptE.x, pLine->ptE.y);SelectObject(hdc, hPenOld);DeleteObject(hPen); }
void DrawMyRect(HDC hdc, PMYPIC pRect) // 繪制一個矩形 {HPEN hPen = CreatePenIndirect(&(pRect->logpen));HPEN hPenOld = (HPEN)SelectObject(hdc, hPen);HBRUSH hNewBrush = CreateBrushIndirect (&(pRect->logbrush));HBRUSH hOldBrush = (HBRUSH)SelectObject (hdc, hNewBrush);Rectangle(hdc,pRect->ptS.x,pRect->ptS.y,pRect->ptE.x,pRect->ptE.y);SelectObject(hdc, hPenOld);DeleteObject(hPen);SelectObject(hdc,hOldBrush);DeleteObject(hNewBrush); }
void DrawMyEll(HDC hdc, PMYPIC pRect) // 繪制一個橢圓 {HPEN hPen = CreatePenIndirect(&(pRect->logpen));HPEN hPenOld = (HPEN)SelectObject(hdc, hPen);HBRUSH hNewBrush = CreateBrushIndirect (&(pRect->logbrush));HBRUSH hOldBrush = (HBRUSH)SelectObject (hdc, hNewBrush);Ellipse(hdc,pRect->ptS.x,pRect->ptS.y,pRect->ptE.x,pRect->ptE.y);SelectObject(hdc, hPenOld);DeleteObject(hPen);SelectObject(hdc,hOldBrush);DeleteObject(hNewBrush); }

void DrawMyText(HDC hdc,PMYPIC pText) //畫文字 {HFONT hFont=CreateFontIndirect(&(pText->logfont));HFONT hFontOld = (HFONT)SelectObject (hdc, hFont);SetTextColor(hdc,pText->textColor);TextOut(hdc,(pText->ptS.x+pText->ptE.x)/2,(pText->ptS.y+pText->ptE.y)/2,pText->szText,lstrlen(pText->szText));GetTextExtentPoint32 (hdc,pText->szText, lstrlen (pText->szText), &pText->size);SelectObject(hdc,hFontOld);DeleteObject (hFont); }

int Sum_Pics(PMYPIC pPic,int len)//返回現有圖片總數 {for (int i=0;i<len;i++){if (pPic[i].order==0)return i;}return 0;//保留 }


void DrawAll(HDC hdc, PMYPIC pPic,int count)//畫所有圖像,包括線,矩形,橢圓 {for (int i=0;i<count;i++){if(pPic[i].DrawObj==0)break;switch (pPic[i].DrawObj){case ID_PIC_LINE:DrawMyLine(hdc,&(pPic[i]));break;case ID_PIC_RECT:DrawMyRect(hdc,&(pPic[i]));break;case ID_PIC_ELL: DrawMyEll(hdc,&(pPic[i]));break;case ID_PIC_TEXT:DrawMyText(hdc,&(pPic[i]));break;//default: break;}} }


void SaveData(PMYPIC pPic,int len)//保存圖像到文件 {FILE* fp;errno_t err;if((err=fopen_s(&fp,"data.bin","wb+"))==0){fwrite(pPic,sizeof(*pPic),len,fp);fclose(fp);MessageBox(NULL, L"保存成功!",L"提示",MB_ICONEXCLAMATION|MB_OK);}else MessageBox(NULL, L"保存失敗!",L"Error!",MB_ICONEXCLAMATION|MB_OK);; }


void ClearArg(PMYPIC pPic,int len)//清空儲存圖像的數組 {for(int i=0;i<len;i++){pPic[i].ptS.x=0;pPic[i].ptS.y=0;pPic[i].ptE.x=0;pPic[i].ptE.y=0;pPic[i].logpen.lopnColor=0;pPic[i].logpen.lopnStyle=0;pPic[i].logpen.lopnWidth.x=0;pPic[i].logpen.lopnWidth.y=0;pPic[i].logbrush.lbColor=0;pPic[i].logbrush.lbHatch=0;pPic[i].logbrush.lbStyle=0;pPic[i].DrawObj=0;pPic[i].order=0;} }


bool LoadData(PMYPIC pPic,int len,bool open_tip)//從文件讀取圖像 {FILE* fp;errno_t err;if((err=fopen_s(&fp,"data.bin","rb+"))==0){fread(pPic,sizeof(*pPic),len,fp);fclose(fp);if(open_tip)MessageBox(NULL, L"加載成功!",L"提示",MB_ICONEXCLAMATION|MB_OK);return 1;}else {MessageBox(NULL, L"加載失敗!",L"Error!",MB_ICONEXCLAMATION|MB_OK);return 0;} }


double Dis_p2p(POINT p1,POINT p2)//點到點的距離 {return sqrt(1.0*(p1.x-p2.x)*(p1.x-p2.x)+1.0*(p1.y-p2.y)*(p1.y-p2.y)); } double Dis_p2line(POINT ptS,POINT ptE,POINT p)//點到線段的距離 {double a,b,c;a=Dis_p2p(ptS,p);if(a<=0.00001)return 0.0f;b=Dis_p2p(ptE,p);if(b<=0.00001)return 0.0f;c=Dis_p2p(ptS,ptE); //三角形底邊if(c<=0.00001)return a; //線段太短if(a*a>=b*b+c*c) return b;if(b*b>=a*a+c*c) return a;double l=(a+b+c)/2; //三角形周長double s=sqrt(l*(l-a)*(l-b)*(l-c));//三角形面積return 2*s/c; }

/*********************************** *判斷選中哪個圖形的函數,返回選中圖形 *的次序,未選中返回0 ************************************/ int SelectedPic(POINT p, PMYPIC pPic,int len) {for (int i=Sum_Pics(pPic,len)-1;i>=0;i--){switch (pPic[i].DrawObj){case ID_PIC_LINE:/*if(abs((pPic[i].ptE.y-pPic[i].ptS.y)*p.x-(pPic[i].ptE.x-pPic[i].ptS.x)*p.y-pPic[i].ptS.x*(pPic[i].ptE.y-pPic[i].ptS.y)+pPic[i].ptS.y*(pPic[i].ptE.x-pPic[i].ptS.x))/sqrt(pow((pPic[i].ptE.y-pPic[i].ptS.y)*1.0,2)+pow((pPic[i].ptE.x-pPic[i].ptS.x)*1.0,2))<2)return pPic[i].order;*/ //點到直線的距離是錯誤的if((Dis_p2line(pPic[i].ptS,pPic[i].ptE,p))<=pPic[i].logpen.lopnWidth.x)return pPic[i].order;break;case ID_PIC_RECT:if(abs(pPic[i].ptS.x-p.x)+abs(pPic[i].ptE.x-p.x)<=abs(pPic[i].ptS.x-pPic[i].ptE.x) && abs(pPic[i].ptS.y-p.y)+abs(pPic[i].ptE.y-p.y)<=abs(pPic[i].ptS.y-pPic[i].ptE.y))return pPic[i].order;break;case ID_PIC_ELL:if((p.x-(pPic[i].ptS.x+pPic[i].ptE.x)/2.0)*(p.x-(pPic[i].ptS.x+pPic[i].ptE.x)/2.0)/(((pPic[i].ptS.x-pPic[i].ptE.x)/2.0)*((pPic[i].ptS.x-pPic[i].ptE.x)/2.0))+(p.y-(pPic[i].ptS.y+pPic[i].ptE.y)/2.0)*(p.y-(pPic[i].ptS.y+pPic[i].ptE.y)/2.0)/(((pPic[i].ptS.y-pPic[i].ptE.y)/2.0)*((pPic[i].ptS.y-pPic[i].ptE.y)/2.0))<=1)return pPic[i].order;break;case ID_PIC_TEXT:if(abs(p.x-(pPic[i].ptS.x+pPic[i].ptE.x)/2)+abs(p.x-((pPic[i].ptS.x+pPic[i].ptE.x)/2+pPic[i].size.cx))<=pPic[i].size.cx && abs(p.y-(pPic[i].ptS.y+pPic[i].ptE.y)/2)+abs(p.y-((pPic[i].ptS.y+pPic[i].ptE.y)/2+pPic[i].size.cy))<=pPic[i].size.cy)return pPic[i].order;break; default:break;}}return FALSE; }

void DeletePic(PMYPIC pPic,int order,int len)//刪除一個圖像 {for(int i=0;i<Sum_Pics(pPic,len)-order+1;i++){pPic[order-1+i]=pPic[order+i];pPic[order-1+i].order=order+i;//這句很關鍵} }//最后一個圖形的清零如何?



總結

以上是生活随笔為你收集整理的Win32 鼠标绘图代码研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。