#include #include"DIB8or24.h" #include"outline.h" #define APP_NAME TEXT("Sample_MainWindow") LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static int i=1; //外側と内側の輪郭(1) or 外側の輪郭(-1) //ファイル static OPENFILENAME ofn; static char szFile[MAX_PATH]; static char szFileTitle[MAX_PATH]; //画像 static LPDWORD lpPixel; static BITMAPINFO bmpInfo; static int iWidth,iHeight; //非対象領域の色 static DWORD BackColor; //外側と内側の輪郭 static LPBYTE outline; static LPPOINT lpPoints; static LPINT lpPolyCounts; static int nCount; //外側の輪郭 static LPPOINT lpPoints2; static int nCount2; //リージョン static HRGN hRgn; switch(uMsg){ case WM_CREATE: //OPENFILENAME 構造体の初期化 ofn.lStructSize=sizeof(OPENFILENAME); ofn.hwndOwner=hWnd; ofn.lpstrFilter="8/24bitBMP(*.bmp)\0*.bmp\0"; ofn.lpstrFile=szFile; ofn.nMaxFile=MAX_PATH; ofn.lpstrFileTitle=szFileTitle; ofn.nMaxFileTitle=MAX_PATH; ofn.Flags=OFN_FILEMUSTEXIST; ofn.lpstrDefExt="bmp"; ofn.lpstrTitle="8/24ビットのBMPファイルを選択して下さい"; //ファイルを開くダイアログボックス表示 if(!GetOpenFileName(&ofn)){ MessageBox(hWnd,"8/24ビットのBMPファイルを選択して下さい","終了します",MB_OK); SendMessage(hWnd,WM_CLOSE,0,0); return 0; } //画像を読み込む lpPixel=BMP8or24toDIB(ofn.lpstrFile,&bmpInfo); if(lpPixel==NULL){ //非対応のファイル形式である MessageBox(hWnd,"非対応のファイル形式です","終了します",MB_OK); SendMessage(hWnd,WM_CLOSE,0,0); return 0; } iWidth=bmpInfo.bmiHeader.biWidth; iHeight=bmpInfo.bmiHeader.biHeight; //ウィンドウサイズを画像サイズに合わせる MoveWindow(hWnd,0,0,iWidth,iHeight,TRUE); //正しく準備された画像か? if((lpPixel[0]!=lpPixel[iWidth-1]) || (lpPixel[0]!=lpPixel[(iHeight-1)*iWidth]) || (lpPixel[0]!=lpPixel[iWidth-1+(iHeight-1)*iWidth])){ MessageBox(hWnd,"画像が不正です","終了します",MB_OK); SendMessage(hWnd,WM_CLOSE,0,0); return 0; } //透過させたい色を取得 BackColor=lpPixel[0]; //外側と内側の輪郭を取得 outline=GetOutlineEx(lpPixel,iWidth,iHeight,BackColor); if(outline==NULL){ //限界まで座標を取得した MessageBox(hWnd,"輪郭が複雑すぎます(GetOutlineEx関数)","終了します",MB_OK); SendMessage(hWnd,WM_CLOSE,0,0); return 0; } lpPoints=GetlpPoints(outline); lpPolyCounts=GetlpPolyCounts(outline); nCount=GetnCount(outline); //外側の輪郭を取得 lpPoints2=GetOutline(lpPixel,iWidth,iHeight,BackColor,&nCount2); if(lpPoints2==NULL){ //限界まで座標を取得した MessageBox(hWnd,"輪郭が複雑すぎます(GetOutline関数)","終了します",MB_OK); SendMessage(hWnd,WM_CLOSE,0,0); return 0; } case WM_RBUTTONDOWN: //リージョン作成 if(i==1) hRgn=CreatePolyPolygonRgn(lpPoints,lpPolyCounts,nCount,ALTERNATE); else hRgn=CreatePolygonRgn(lpPoints2,nCount2,ALTERNATE); i=-i; SetWindowRgn(hWnd,hRgn,TRUE); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); StretchDIBits(hdc,0,0,iWidth,iHeight, 0,0,iWidth,iHeight, lpPixel,&bmpInfo,DIB_RGB_COLORS,SRCCOPY); //終点1ピクセルは描画されない //PolyPolyline(hdc,lpPoints,(DWORD *)lpPolyCounts,nCount); //Polyline(hdc,lpPoints2,nCount2); EndPaint(hWnd,&ps); return 0; case WM_LBUTTONDOWN: PostMessage(hWnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam); return 0; case WM_KEYDOWN: if(wParam==VK_ESCAPE) PostMessage(hWnd,WM_CLOSE,0,0); return 0; case WM_DESTROY: DeleteObject(hRgn); FreeOutline(lpPoints2); FreeOutlineEx(outline); FreeDIB(lpPixel); PostQuitMessage(0); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; wc.style =CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc =WindowProc; wc.cbClsExtra =0; wc.cbWndExtra =0; wc.hInstance =hInstance; wc.hIcon =LoadIcon(NULL,IDI_APPLICATION); wc.hCursor =LoadCursor(NULL,IDC_ARROW); wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName =NULL; wc.lpszClassName =APP_NAME; if(!RegisterClass(&wc)) return 0; if(CreateWindow( APP_NAME,TEXT(__FILE__), WS_POPUP | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL)==NULL) return 0; while(GetMessage(&msg,NULL,0,0)>0){ DispatchMessage(&msg); } return (int)msg.wParam; }