0から始めるVisualStudio2022:ソフト開発塾

クロスカーソル的なものを表示する。
前回のプロジェクトを追加&修正
追加したしたソースは
#include <windows.h>

//
//  mp_mode : 1 : 消去のみ 2: OLD表示
//          1,2の場合、mp_x,mp_y は、無視
void cross_cursor(HWND mp_hWnd, int mp_x, int mp_y, int mp_mode) {
    RECT rect;
    GetClientRect(mp_hWnd, &rect);
    static int mm_old_flag = 0;
    static int mm_x_old, mm_y_old, mm_x1_old, mm_y1_old, mm_x2_old, mm_y2_old;
    HDC mm_hdc;
    mm_hdc = GetDC(mp_hWnd);
    //POINT pt;
    SetROP2(mm_hdc, R2_NOTXORPEN);

    HPEN mm_hPen;
    HGDIOBJ mm_hPenOld;
    //mm_hPen = ExtCreatePen(PS_GEOMETRIC,            5, &lb, 0, NULL);
    mm_hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
    mm_hPenOld = SelectObject(mm_hdc, mm_hPen);
    if (mm_old_flag || mp_mode==2) {
        MoveToEx(mm_hdc, mm_x_old, mm_y1_old, NULL);
        LineTo(mm_hdc, mm_x_old, mm_y2_old);
        MoveToEx(mm_hdc, mm_x1_old, mm_y_old, NULL);
        LineTo(mm_hdc, mm_x2_old, mm_y_old);
        mm_old_flag = 0;
    }
    if (mp_mode) {
        if (mp_mode == 2) {
            mm_old_flag = 1;
        }
    }
    else {
        mm_x1_old = rect.left;
        mm_y1_old = rect.top;
        mm_x2_old = rect.right;
        mm_y2_old = rect.bottom;
        mm_x_old = mp_x;// LOWORD(lPara);
        mm_y_old = mp_y;// HIWORD(lPara);
        MoveToEx(mm_hdc, mm_x_old, mm_y1_old, NULL);
        LineTo(mm_hdc, mm_x_old, mm_y2_old);
        MoveToEx(mm_hdc, mm_x1_old, mm_y_old, NULL);
        LineTo(mm_hdc, mm_x2_old, mm_y_old);
        mm_old_flag = 1;
    }
    SelectObject(mm_hdc, mm_hPenOld);
    DeleteObject(mm_hPen);
    ReleaseDC(mp_hWnd, mm_hdc);
}
//
void cross_cursor(HWND mp_hWnd, int mp_x, int mp_y) {
    cross_cursor(mp_hWnd, mp_x, mp_y, 0);
}
//
void cross_cursor(HWND mp_hWnd, int mp_mode) {
    if (mp_mode) {
        cross_cursor(mp_hWnd, 0, 0, mp_mode);
    }
}
こんな感じ。
ヘッダー用は
#pragma once
void cross_cursor(HWND mp_hWnd, int mp_mode);
void cross_cursor(HWND mp_hWnd, int mp_x, int mp_y);
void cross_cursor(HWND mp_hWnd, int mp_x, int mp_y, int mp_mode);
こんな感じ。
前に行った様に、ダイアログに、スタティックテキストを配置
IDを、IDC_TEXT1 に変更
ソース(dialog.cpp)を修正
WM_MOUSEMOVE に追加
    case WM_MOUSEMOVE: {
        cross_cursor(hDlg, LOWORD(lPara), HIWORD(lPara));
        char mm_buff[128];
        sprintf_s(mm_buff, sizeof(mm_buff), "(%d:%d)   ", LOWORD(lPara), HIWORD(lPara));
        SetDlgItemTextA(hDlg, IDC_TEXT1, mm_buff);
        break;
    }
まぁ、まぁ、まぁ
って、感じのかなぁ。
とりあえず、タイマを停止して、気に入らないところを洗い出し。
        //SetTimer(hDlg, IDT_TIMER1, 1000 / 4, (TIMERPROC)NULL);
気に入らないところ
1.マウスがウィンドウから外れた時十字ラインが残る。
2.スクロールを行ったとき、十字ラインが残る&現れる。
3.趣旨から外れているが、スクロールを行ったとき、スタティックテキスト及びボタンがズレる。
対策:
 WM_PAINT の前後に
    cross_cursor(hDlg, 1);
と
    cross_cursor(hDlg, 2);
を追加しただけで、スタティックテキスト及びボタン以外まぁクリアかなぁ
つづく




Top