クリックした座標のハンドル

[戻る]
たまごっち 2002/01/18(金) 15:18:24
クリックした座標のハンドルを得る方法を教えてください。
クリックした時、メッセージで、キーとかマウスのボタンの押し状態と
マウス座標が得られることが分かりました。

クリックした座標が、hWndなのかhEditなのかを知りたいです。
座標からハンドル名を得る関数が分かればできると思うんだけど
いい方法があれば教えてください。

CdS 2002/01/18(金) 16:54:52
「ハンドル名」という語句は使わないと思いますが、「クラス名」を取得したいならGetClassNameです。
「ハンドル」を取得したいのならWindowFromPointでしょうか。

たまごっち 2002/01/20(日) 15:00:22
ハンドルが得られるようになりました。
ハンドルを文字列として取り出すにはどうしたらいいんですか?

ハンドルが得らえたけど、位置がずれてます。
エディットボックスの少し下がエディットボックスになっています。
この修正はどうしたらいいんですか?


#include <windows.h>

HWND hEDIT;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int){

    HWND hWnd;
    WNDCLASSEX wc;
    MSG msg;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.lpszClassName = "test";
    wc.lpszMenuName = NULL;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);

    if(!RegisterClassEx(&wc))return FALSE;

    hWnd = CreateWindow("test","",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        10,10,450,450,
        HWND_DESKTOP,NULL,hInstance,NULL);

    hEDIT = CreateWindow("EDIT","",
        WS_CHILD | WS_VISIBLE | WS_BORDER,
        30,30,200,25,
        hWnd,NULL,hInstance,NULL);

    while(GetMessage(&msg,NULL,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){

    HDC hDC;
    PAINTSTRUCT ps;
    POINT pt;

    switch(msg){
    case WM_LBUTTONDOWN:
    hDC = GetDC(hWnd);
    GetCursorPos( &pt );
    ScreenToClient( hWnd, &pt );

    if(WindowFromPoint(pt) == HWND_DESKTOP)
        TextOut(hDC, 5, 120, "デスクトップ", 12);
    else if(WindowFromPoint(pt) == hEDIT)
        TextOut(hDC, 5, 120, "エディットボックス", 18);
    else if(WindowFromPoint(pt) == hWnd)
        TextOut(hDC, 5, 120, "このウインドウ", 14);
    else TextOut(hDC, 5, 120, "その他", 6);


    if(ChildWindowFromPoint(hWnd, pt) == HWND_DESKTOP)
        TextOut(hDC, 5, 140, "デスクトップ", 12);
    else if(ChildWindowFromPoint(hWnd, pt) == hEDIT)
        TextOut(hDC, 5, 140, "エディットボックス", 18);
    else if(ChildWindowFromPoint(hWnd, pt) == hWnd)
        TextOut(hDC, 5, 140, "このウインドウ", 14);
    else TextOut(hDC, 5, 140, "その他", 6);

    ReleaseDC(hWnd, hDC);
    break;

    case WM_DESTROY:
    PostQuitMessage(0);
    break;
        
    default:
    return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    return 0;
}

古いスレッドには追加発言できません。