- ベストアンサー
四角形と線との関係(C言語・API)
C言語にてWINDOWS APIのプログラミングをしています。 そこでちょっとわからないのですが、 このソースをご覧いただけますか。 http://onegaisimasune.web.fc2.com/main7.txt このソースは、ウィンドウ上に四角形があり、 また、クリックで線も引けるというものですが、 四角形の上から線を引くと、線が四角形の下に かぶさってしまいます。 何とか四角形の上に持ってくる方法はありませんでしょうか。 宜しくお願い致します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
以下に変更してみてはどうですか? #include <windows.h> #include <tchar.h> // 定数 int push = 0; // 左ボタンが押されているか #define WINDOW_WIDTH (400) // ウィンドウの幅 #define WINDOW_HEIGHT (300) // ウィンドウの高さ #define WINDOW_X ((GetSystemMetrics( SM_CXSCREEN ) - WINDOW_WIDTH ) / 2) #define WINDOW_Y ((GetSystemMetrics( SM_CYSCREEN ) - WINDOW_HEIGHT ) / 2) #define MAX 100 // プロトタイプ宣言 HWND Create(HINSTANCE hInst); LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); // 開始位置 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd) { HWND hWnd; MSG msg; // ウィンドウを作成する hWnd = Create( hInst ); if( hWnd == NULL ) { MessageBox( NULL, _T("ウィンドウの作成に失敗しました"), _T("エラー"), MB_OK ); return 1; } // ウィンドウを表示する ShowWindow( hWnd, SW_SHOW ); UpdateWindow( hWnd ); // メッセージループ while( 1 ) { BOOL ret = GetMessage( &msg, NULL, 0, 0 ); // メッセージを取得する if( ret == 0 || ret == -1 ) { // アプリケーションを終了させるメッセージが来ていたら、 // あるいは GetMessage() が失敗したら( -1 が返されたら )、ループを抜ける break; } else { // メッセージを処理する TranslateMessage( &msg ); DispatchMessage( &msg ); } } return msg.wParam; } // ウィンドウを作成する HWND Create(HINSTANCE hInst) { WNDCLASSEX wc; // ウィンドウクラスの情報を設定 wc.cbSize = sizeof(wc); // 構造体サイズ wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; // スタイル wc.lpfnWndProc = WndProc; // ウィンドウプロシージャ wc.cbClsExtra = 0; // 拡張情報1 wc.cbWndExtra = 0; // 拡張情報2 wc.hInstance = hInst; // インスタンスハンドル wc.hIcon = (HICON)LoadImage( // アイコン NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED ); wc.hIconSm = wc.hIcon; // 子アイコン wc.hCursor = (HCURSOR)LoadImage( // マウスカーソル NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED ); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // ウィンドウ背景 wc.lpszMenuName = NULL; // メニュー名 wc.lpszClassName = _T("Default Class Name");// ウィンドウクラス名 // ウィンドウクラスを登録する if( RegisterClassEx( &wc ) == 0 ){ return NULL; } // ウィンドウを作成する return CreateWindow( wc.lpszClassName, // ウィンドウクラス名 _T("Sample Program"), // タイトルバーに表示する文字列 WS_OVERLAPPEDWINDOW, // ウィンドウの種類 WINDOW_X, // ウィンドウを表示する位置(X座標) WINDOW_Y, // ウィンドウを表示する位置(Y座標) WINDOW_WIDTH, // ウィンドウの幅 WINDOW_HEIGHT, // ウィンドウの高さ NULL, // 親ウィンドウのウィンドウハンドル NULL, // メニューハンドル hInst, // インスタンスハンドル NULL // その他の作成データ ); } // ウィンドウプロシージャ // ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { static POINT start[MAX]; // 四角形の始点 static POINT end[MAX]; // 四角形の終点 static int num=0; HDC hDC,hdc; HPEN hPen; PAINTSTRUCT ps; int i; switch( msg ) { case WM_LBUTTONDOWN: if (num<MAX) push=1; return 0; case WM_MOUSEMOVE: if (push==1) { start[num].x = LOWORD( lp ); start[num].y = HIWORD( lp ); push=2; } else if (push==2) { end[num].x = LOWORD( lp ); end[num].y = HIWORD( lp ); InvalidateRect( hWnd, NULL, TRUE ); } return 0; case WM_LBUTTONUP: push=0,num++; break; case WM_PAINT: // 無効領域があるとき // 四角形を描く hDC = BeginPaint( hWnd, &ps ); if (num) for (i=0;i<=num;i++) { hPen = CreatePen( PS_SOLID, 1, RGB(0, 0, 0) ); // 黒い点線のペンを作成 SelectObject( hDC, hPen ); // 作成したペンを使用するように設定 MoveToEx(hDC , start[i].x , start[i].y , NULL); LineTo(hDC , end[i].x , end[i].y);// 四角形を描画 } if( push==2 ){ // ドラッグ中の描画処理 MoveToEx(hDC , start[num].x , start[num].y , NULL); LineTo(hDC , end[num].x , end[num].y);// 四角形を描画 }// 作成したペンを削除 DeleteObject( hPen ); EndPaint( hWnd, &ps ); return 0; case WM_DESTROY: // ウィンドウが破棄されるとき PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wp, lp ); }
補足
わざわざすいません(^^; ありがとうございます!