#include #include "resource.h" /* グローバル変数 */ HINSTANCE hInst; /* 現在のインスタンス */ HBITMAP hBitmap[4]; int bmpNo; HRGN hRgn, hRgn2; HRGN hRgns[4]; #include "crRgnBmp.c" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; TCHAR szWindowClass[] = "rgnwnd"; /* BLOCK : ウィンドウ クラスの登録 */ { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = 0; wcex.lpfnWndProc = (WNDPROC) WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = 0; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(BLACK_BRUSH); // (COLOR_WINDOW + 1); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = NULL; RegisterClassEx(&wcex); } /* BLOCK : アプリケーションの初期化 */ { HWND hWnd; /* グローバル変数にインスタンス ハンドルの保存 */ hInst = hInstance; /* メイン ウィンドウの作成 */ hWnd = CreateWindowEx( WS_EX_TOPMOST | WS_EX_TOOLWINDOW , szWindowClass , NULL , WS_POPUP , CW_USEDEFAULT , CW_USEDEFAULT , 72 /*+ GetSystemMetrics(SM_CXSIZEFRAME)*2*/ , 72 /*+ GetSystemMetrics(SM_CYSIZEFRAME)*2+GetSystemMetrics(SM_CYMENU)+GetSystemMetrics(SM_CYCAPTION)*/ , NULL , NULL , hInstance , NULL ); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); } /* メイン メッセージ ループ: */ while (GetMessage(&msg, NULL, 0, 0)) { /*if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))*/ { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); /* メニュー選択の解析: */ switch (wmId) { case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: { static int bmpnos[4] = {IDB_SIOTERU0, IDB_SIOTERU1, IDB_SIOTERU2, IDB_SIOTERU3}; HBITMAP hBmp; PAINTSTRUCT ps; HDC hdc; HDC hBmpDc; hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(bmpnos[bmpNo])); hdc = BeginPaint(hWnd, &ps); { /* この位置に描画用のコードを追加 */ hBmpDc = CreateCompatibleDC(hdc); SelectObject(hBmpDc, hBmp/*hBitmap[bmpNo]*/); //BitBlt(hdc, 0,0,72,72, hBmpDc, 0,0, BLACKNESS); BitBlt(hdc, 0,0,72,72, hBmpDc, 0,0, SRCCOPY); } EndPaint(hWnd, &ps); DeleteDC(hBmpDc); DeleteObject(hBmp); #if 1 hRgn2 = CreateRectRgn(0, 0, 0, 0); CombineRgn(hRgn2, hRgn2, hRgns[bmpNo], RGN_OR); //hRgn2 = CreateRgnFromBmp(hBitmap[bmpNo], (UINT)-1); SetWindowRgn(hWnd, hRgn2, TRUE); if (hRgn) DeleteObject(hRgn); hRgn = hRgn2; SetProp(hWnd, "region", hRgn); #endif break; } case WM_CREATE: { //HRGN hRgns; RECT rect; int i; hBitmap[0] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SIOTERU0)); hBitmap[1] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SIOTERU1)); hBitmap[2] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SIOTERU2)); hBitmap[3] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SIOTERU3)); bmpNo = 0; GetClientRect(hWnd, &rect); for (i = 0; i < 4; i++) { hRgns[i] = CreateRgnFromBmp(hBitmap[i], (UINT)-1); } //hRgn2 = CreateEllipticRgn(0, 0, rect.right, rect.bottom); hRgn2 = CreateRectRgn(0, 0, 0, 0); CombineRgn(hRgn2, hRgn2, hRgns[bmpNo], RGN_OR); //hRgn2 = CreateRgnFromBmp(hBitmap[0], (UINT)-1); SetWindowRgn(hWnd, hRgn2, 0/*TRUE*/); hRgn = hRgn2; SetProp(hWnd, "region", hRgn); SetTimer(hWnd,1, 17*5, NULL); /* タイマー割り込み設定. 1000/60=17ms */ break; } case WM_TIMER: // 約 5/60秒ごとの処理 //{ // static RECT r; // static int tmr; // int x,y; // tmr++; // x = 1/*tmr % 32*/; // y = 0; // if (x > 15) // x = 32 - x; // GetWindowRect(hWnd, &r); // MoveWindow(hWnd, r.left+x, r.top+y, r.right-r.left, r.bottom-r.top, 0/*TRUE*/); //} bmpNo = (bmpNo + 1) % 4; //GetWindowRgn(hWnd, hRgn); #if 0 hRgn2 = CreateRectRgn(0, 0, 0, 0); CombineRgn(hRgn2, hRgn2, hRgns[bmpNo], RGN_OR); //hRgn2 = CreateRgnFromBmp(hBitmap[bmpNo], (UINT)-1); SetWindowRgn(hWnd, hRgn2, 0/*TRUE*/); if (hRgn) DeleteObject(hRgn); hRgn = hRgn2; SetProp(hWnd, "region", hRgn); #endif InvalidateRect(hWnd, NULL, 0); break; case WM_DESTROY: { int i; for (i = 0; i < 4; i++) { if (hBitmap[i]) { DeleteObject(hBitmap[i]); } } if (GetProp(hWnd, "region")) { DeleteObject(GetProp(hWnd, "region")); RemoveProp(hWnd, "region"); } KillTimer(hWnd,1); /* タイマー割り込み終了 */ PostQuitMessage(0); break; } case WM_NCRBUTTONDOWN: { int xPos, yPos; HMENU hMenu, hSubMenu; xPos = LOWORD(lParam); yPos = HIWORD(lParam); hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDC_MAS/*IDC_RGNWND*/)); hSubMenu = GetSubMenu(hMenu, 0); TrackPopupMenu(hSubMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, xPos, yPos, 0, hWnd, NULL); break; } case WM_NCHITTEST: { /* あたかもタイトルバーにマウスがあるようにWindowsを騙す */ wParam = DefWindowProc(hWnd, message, wParam, lParam); if (wParam == HTCLIENT) return HTCAPTION; return wParam; } default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }