#include #include "resource.h" HINSTANCE hInst; HWND hDlg,hSqr,hCir,hPenw,hScroll; char szName[32]; char szClassName[]="sample07"; POINTS start,end,old_end; typedef struct __FLG__ { BOOL dialog; BOOL sqrt; BOOL circul; BOOL pen; } FLG; typedef struct __PENPROPATY__ { short int Red; short int Green; short int Blue; int nPos; } PENPROPATY; static FLG ff; //選択領域 void DrawRect(HWND hWnd,POINTS beg,POINTS end){ HDC hdc; hdc=GetDC(hWnd); SetROP2(hdc,R2_NOT); MoveToEx(hdc,beg.x,beg.y,NULL); LineTo(hdc,end.x,beg.y); LineTo(hdc,end.x,end.y); LineTo(hdc,beg.x,end.y); LineTo(hdc,beg.x,beg.y); LineTo(hdc,end.x,end.y); ReleaseDC(hWnd,hdc); return ; } //描画ペンの太さ BOOL SetPixelExtend(HDC hdc,POINTS old_ppos,POINTS new_ppos,PENPROPATY *pp){ HPEN hPens; BOOL jude; hPens=CreatePen(PS_SOLID,pp->nPos,RGB(pp->Red,pp->Green,pp->Blue)); SelectObject(hdc,hPens); MoveToEx(hdc,old_ppos.x,old_ppos.y,NULL); LineTo(hdc,new_ppos.x,new_ppos.y); DeleteObject(hPens); return jude; } HFONT MyCreateFont(int nHeight,DWORD dwCharSet,LPCTSTR lpName){ return( CreateFont(nHeight,0,0,0, FW_DONTCARE, FALSE,FALSE,FALSE, dwCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, lpName)); } //ダイアログプロシージャ BOOL CALLBACK MyDlgProc(HWND hDlg,UINT msg,WPARAM wp,LPARAM lp) { static HWND hParent; switch(msg){ case WM_INITDIALOG : hParent = GetParent(hDlg); break; case WM_COMMAND : switch(LOWORD(wp)){ case IDOK : GetDlgItemText(hDlg,IDC_EDIT1,szName,(int)sizeof(szName)-1); { ff.dialog=TRUE; ff.circul=FALSE; ff.sqrt=FALSE; ff.pen=FALSE; } InvalidateRect(hParent,NULL,TRUE); EndDialog(hDlg,IDOK); return TRUE; case IDCANCEL : SetDlgItemText(hDlg,IDC_EDIT1,""); return TRUE; case IDC_CLOSE_CHAR : EndDialog(hDlg,IDC_CLOSE_CHAR); return TRUE; } return FALSE; } return FALSE; } //矩形プロシージャ BOOL CALLBACK MySqrProc(HWND hSqr,UINT msg,WPARAM wp,LPARAM lp) { static HWND hParent; static RECT *rr; char space[4][16]; switch(msg){ case WM_INITDIALOG : rr=(RECT *)lp; hParent = GetParent(hSqr); break; case WM_COMMAND : switch(LOWORD(wp)){ case IDOK : GetDlgItemText(hSqr,IDC_EDITSX,space[0],(int)sizeof(space[0])-1); GetDlgItemText(hSqr,IDC_EDITSY,space[1],(int)sizeof(space[1])-1); GetDlgItemText(hSqr,IDC_EDITEX,space[2],(int)sizeof(space[2])-1); GetDlgItemText(hSqr,IDC_EDITEY,space[3],(int)sizeof(space[3])-1); rr->left=(LONG)atoi(space[0]); rr->top=(LONG)atoi(space[1]); rr->right=(LONG)atoi(space[2]); rr->bottom=(LONG)atoi(space[3]); { ff.dialog=FALSE; ff.circul=FALSE; ff.sqrt=TRUE; ff.pen=FALSE; } InvalidateRect(hParent,NULL,TRUE); EndDialog(hSqr,IDOK); return TRUE; case IDCANCEL : SetDlgItemText(hSqr,IDC_EDITSX,"0"); SetDlgItemText(hSqr,IDC_EDITSY,"0"); SetDlgItemText(hSqr,IDC_EDITEX,"0"); SetDlgItemText(hSqr,IDC_EDITEY,"0"); return TRUE; case IDC_CLOSE_SQRT : EndDialog(hSqr,IDC_CLOSE_SQRT); return TRUE; } return FALSE; } return FALSE; } //丸形プロシージャ BOOL CALLBACK MyCirProc(HWND hCir,UINT msg,WPARAM wp,LPARAM lp) { static HWND hParent; static RECT *rr; char diag[16]; switch(msg){ case WM_INITDIALOG : rr=(RECT *)lp; hParent = GetParent(hCir); break; case WM_COMMAND : switch(LOWORD(wp)){ case IDOK : GetDlgItemText(hCir,IDC_DIAGONAL,diag,(int)sizeof(diag)-1); rr->left=0L; rr->top=0L; rr->right=(LONG)atoi(diag)*2; rr->bottom=(LONG)atoi(diag)*2; { ff.dialog=FALSE; ff.circul=TRUE; ff.sqrt=FALSE; ff.pen=FALSE; } InvalidateRect(hParent,NULL,TRUE); EndDialog(hCir,IDOK); return TRUE; case IDCANCEL : SetDlgItemText(hCir,IDC_DIAGONAL,"0"); return TRUE; case IDC_CLOSE_CIRCUL : EndDialog(hCir,IDC_CLOSE_CIRCUL); return TRUE; } return FALSE; } return FALSE; } //描画プロシージャ BOOL CALLBACK MyPenProc(HWND hPenw,UINT msg,WPARAM wp,LPARAM lp) { static HWND hParent; char Red[8],Green[8],Blue[8]; static PENPROPATY *rgb; static int nMin ,nMax; char szScrollChar[32]; switch(msg){ case WM_HSCROLL : GetScrollRange(hScroll,SB_CTL,&nMin,&nMax); switch(LOWORD(wp)){ case SB_LINELEFT : rgb->nPos--; if(rgb->nPosnPos=nMin; break; case SB_LINERIGHT : rgb->nPos++; if(rgb->nPos>nMax) rgb->nPos=nMax; break; case SB_PAGELEFT : rgb->nPos -= 10; if(rgb->nPosnPos=nMin; break; case SB_PAGERIGHT : rgb->nPos+= 10; if(rgb->nPos>nMax) rgb->nPos=nMax; break; case SB_THUMBTRACK : rgb->nPos=HIWORD(wp); break; case SB_THUMBPOSITION : rgb->nPos =HIWORD(wp); break; } SetScrollPos(hScroll,SB_CTL,rgb->nPos,TRUE); wsprintf(szScrollChar,"ペンの太さ:%d",rgb->nPos); SetDlgItemText(hPenw,IDC_STATIC_PEN,szScrollChar); InvalidateRect(hParent,NULL,FALSE); return TRUE; case WM_INITDIALOG : rgb=(PENPROPATY *)lp; hParent = GetParent(hPenw); SetDlgItemText(hPenw,IDC_RED,"0"); SetDlgItemText(hPenw,IDC_GREEN,"0"); SetDlgItemText(hPenw,IDC_BLUE,"0"); hScroll=GetDlgItem(hPenw,IDC_SCROLLBAR_PEN); SetScrollRange(hScroll,SB_CTL,0,100,TRUE); SetScrollPos(hScroll,SB_CTL,rgb->nPos,TRUE); wsprintf(szScrollChar,"ペンの太さ:%d",rgb->nPos); SetDlgItemText(hPenw,IDC_STATIC_PEN,szScrollChar); return TRUE; case WM_MOUSEMOVE: GetDlgItemText(hPenw,IDC_RED,Red,(int)sizeof(Red)-1); GetDlgItemText(hPenw,IDC_GREEN,Green,(int)sizeof(Green)-1); GetDlgItemText(hPenw,IDC_BLUE,Blue,(int)sizeof(Blue)-1); rgb->nPos=GetScrollPos(hScroll,SB_CTL); rgb->Red=(short int)atoi(Red)%256; rgb->Green=(short int)atoi(Green)%256; rgb->Blue=(short int)atoi(Blue)%256; { ff.dialog=FALSE; ff.circul=FALSE; ff.sqrt=FALSE; ff.pen=TRUE; } InvalidateRect(hParent,NULL,FALSE); return TRUE; case WM_COMMAND : switch(LOWORD(wp)){ case IDCANCEL : { ff.dialog=FALSE; ff.circul=FALSE; ff.sqrt=FALSE; ff.pen=FALSE; } SetDlgItemText(hPenw,IDC_RED,"0"); SetDlgItemText(hPenw,IDC_GREEN,"0"); SetDlgItemText(hPenw,IDC_BLUE,"0"); rgb->nPos=1; SetScrollPos(hScroll,SB_CTL,rgb->nPos,TRUE); wsprintf(szScrollChar,"ペンの太さ:%d",rgb->nPos); SetDlgItemText(hPenw,IDC_STATIC_PEN,szScrollChar); InvalidateRect(hParent,NULL,TRUE); return TRUE; case IDC_CLOSE_PEN : DestroyWindow(hPenw); return TRUE; } return FALSE; } return FALSE; } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) { int id; //char szBuf[32]; static BOOL bDraw; static HFONT hFont; //HBRUSH hBrush; HDC hdc; HMENU hMenu; PAINTSTRUCT ps; static RECT rc[2],rcbuf[2]; static PENPROPATY rgb; switch(msg){ case WM_CREATE : hMenu = GetMenu(hWnd); hFont=MyCreateFont(12,SHIFTJIS_CHARSET,"HG行書体"); rgb.nPos=1; break; case WM_INITMENU : if(IsWindow(hDlg)){ EnableMenuItem(hMenu,IDM_DLG,MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(hMenu,IDM_SQRT,MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu,IDM_CIRCUL,MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu,IDM_PEN,MF_BYCOMMAND | MF_GRAYED); }else if(IsWindow(hSqr)){ EnableMenuItem(hMenu,IDM_DLG,MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu,IDM_SQRT,MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(hMenu,IDM_CIRCUL,MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu,IDM_PEN,MF_BYCOMMAND | MF_GRAYED); } else if(IsWindow(hCir)){ EnableMenuItem(hMenu,IDM_DLG,MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu,IDM_SQRT,MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu,IDM_CIRCUL,MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(hMenu,IDM_PEN,MF_BYCOMMAND | MF_GRAYED); } else if(IsWindow(hPenw)){ EnableMenuItem(hMenu,IDM_DLG,MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu,IDM_SQRT,MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu,IDM_CIRCUL,MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu,IDM_PEN,MF_BYCOMMAND | MF_ENABLED); } else{ EnableMenuItem(hMenu,IDM_DLG,MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(hMenu,IDM_SQRT,MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(hMenu,IDM_CIRCUL,MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(hMenu,IDM_PEN,MF_BYCOMMAND | MF_ENABLED); } DrawMenuBar(hWnd); break; case WM_LBUTTONDOWN: bDraw=TRUE; end = start = MAKEPOINTS(lp); break; case WM_MOUSEMOVE : end=MAKEPOINTS(lp); rcbuf[0].right=rc[0].right+rc[0].left; rcbuf[0].bottom=rc[0].bottom+rc[0].top; rcbuf[1].right=rc[1].right+rc[1].left; rcbuf[1].bottom=rc[1].bottom+rc[1].top; if(ff.pen || bDraw) InvalidateRect(hWnd,NULL,FALSE); else if(!ff.pen || bDraw) InvalidateRect(hWnd,NULL,TRUE); else return DefWindowProc(hWnd,msg,wp,lp); break; case WM_PAINT : hdc=BeginPaint(hWnd,&ps); if(ff.dialog){ SetBkMode(hdc,TRANSPARENT); SelectObject(hdc,hFont); SetTextColor(hdc,RGB(0,255,255)); TextOut(hdc,end.x+15,end.y,(LPCTSTR)szName,strlen(szName)); DeleteObject(hFont); }else if(ff.sqrt){ SetBkMode(hdc,TRANSPARENT); Rectangle(hdc,end.x,end.y,(int)rcbuf[0].right+end.x,(int)rcbuf[0].bottom+end.y); }else if(ff.circul){ SetBkMode(hdc,TRANSPARENT); Ellipse(hdc,end.x,end.y,(int)rcbuf[1].right+end.x,(int)rcbuf[1].bottom+end.y); }else if(ff.pen && bDraw){ SetPixelExtend(hdc,start,end,&rgb); start=end; }else return DefWindowProc(hWnd,msg,wp,lp); EndPaint(hWnd,&ps); break; case WM_LBUTTONUP : if(bDraw){ bDraw=FALSE; }else return DefWindowProc(hWnd,msg,wp,lp); break; case WM_COMMAND : switch(LOWORD(wp)){ case IDM_END : SendMessage(hWnd,WM_CLOSE,0,0); break; case IDM_ABOUT : MessageBox(hWnd, "Copyright(C)2010 Epsylon\nメニュー", "about",MB_OK); break; case IDM_DLG : DialogBoxParam(hInst,"MYDLG",hWnd,(DLGPROC)MyDlgProc,0L); break; case IDM_SQRT : DialogBoxParam(hInst,"MYSQR",hWnd,(DLGPROC)MySqrProc,(LPARAM)&rc[0]); break; case IDM_CIRCUL : DialogBoxParam(hInst,"MYCIRCUL",hWnd,(DLGPROC)MyCirProc,(LPARAM)&rc[1]); break; case IDM_PEN : hPenw=CreateDialogParam(hInst,"MYPEN",hWnd,(DLGPROC)MyPenProc,(LPARAM)&rgb); ShowWindow(hPenw,SW_NORMAL); break; default : return (DefWindowProc(hWnd,msg,wp,lp)); } break; case WM_CLOSE : id = MessageBox(hWnd,"終了しますよ?","確認",MB_YESNO | MB_ICONINFORMATION ); if(id == IDYES ){ DestroyWindow(hWnd); } case WM_DESTROY : PostQuitMessage(0); break; default : return (DefWindowProc(hWnd,msg,wp,lp)); } return 0; } //メイン関数 int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,LPSTR lpsCmdLine,int nCmdShow) { MSG msg; BOOL bRet; WNDCLASSEX wc; HWND hWnd; HACCEL hAccel; hInst=hCurInst; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hCurInst; wc.hIcon = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage( NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "MYMENU"; wc.lpszClassName = (LPCSTR)szClassName; wc.hIconSm = (HICON)LoadImage( NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); if(RegisterClassEx(&wc)==0) return FALSE; hWnd = CreateWindow(wc.lpszClassName, "ひな型オブジェクト", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hCurInst, NULL); if(!hWnd) return FALSE; ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd); hAccel = LoadAccelerators(hInst,"MYACCEL"); while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1){ break; }else{ if(!hDlg || !IsDialogMessage(hDlg,&msg)){ if(!TranslateAccelerator(hWnd,hAccel,&msg)){ TranslateMessage(&msg); DispatchMessage(&msg); } } } } return (int)msg.wParam; }