2017-10-04 2 views
0

WINAPI에서 마우스 클릭 이벤트가 발생하면 마우스의 x-y 아이콘에 흰색 아이콘이있는 빨간색 아이콘이 표시됩니다. 마우스를 클릭 할 때마다 아이콘을 어떻게 표시합니까? 마우스 클릭을 setwindowshookex에 연결하는 방법을 알고 있습니다. 아래에 표시된 아이콘 쇼와 같은 기능이 있습니까?마우스 클릭 이벤트가있는 화면에 winapi 디스플레이 아이콘이 있습니다.

HHOOK msHOOK; 
//getting the icon let's say from a rc file 
HICON redIcon; 

msHOOK = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, NULL, 0); 

LRESULT CALLBACK mouseProc(int nCode, WPARAM wPar, LPARAM lPar){ 
    IconShow(NULL, redIcon, xofMouse, yofMouse, 0); 
    MessageBox(NULL, "Icon showed", "Cap", 0); 
    return CallNextHookEx(NULL, nCode, wPar, lPar); 
} 

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

감사

UPDATE

#include <windows.h> 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdParam, int iCmdShow){ 
    HWND wnd; 
    MSG msg; 
    WNDCLASSEX wc; 
    wc.cbSize  = sizeof(WNDCLASSEX); 
wc.style   = 0; 
wc.lpfnWndProc = WndProc; 
wc.cbClsExtra = 0; 
wc.cbWndExtra = 0; 
wc.hInstance  = hInstance; 
wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW); 
wc.lpszMenuName = NULL; 
wc.lpszClassName = "ClassName"; 
wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION); 
    wnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_LAYERED, "ClassName", "ss", NULL, CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, NULL, NULL, NULL, NULL); 
    SetLayeredWindowAttributes(wnd, RGB(255, 255, 0), 20, LWA_COLORKEY); 
    ShowWindow(wnd, SW_SHOW); 
    while (GetMessage(&msg, NULL, 0, 0) > 0) { 
     TranslateMessage(&msg); 
    } 
    return 0; 
} 


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_CLOSE: 
      DestroyWindow(hwnd); 
     break; 
     case WM_DESTROY: 
      PostQuitMessage(0); 
     break; 
     case WM_PAINT: 
      //stuff here 
     break; 
     default: 
      return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
} 
+0

이미지를 'HICON'대신'HCURSOR'로로드 할 수 있다면, Win32 API ['SetCursor()'] (https://msdn.microsoft.com/en-us/library)를보십시오. /windows/desktop/ms648393.aspx) 함수를 호출합니다. –

+0

@RemyLebeau – turmuka

+1

을 업데이트했습니다. 창을 전혀 사용하지 않으면 표준 '버튼'을 사용할 수 없습니다. 'WM_ERASEBKGND'와'WM_PAINT' 페인트 메세지를 처리하는 커스텀 윈도우 프로 시저를 가진 커스텀 윈도우 클래스 ('RegisterClass()'참고)가 필요합니다. 'UpdateLayeredWindow()'를 사용하여 비트 맵을 윈도우의 전체 디스플레이로 할당하지 않는다면, 그 메시지를 처리 ​​할 필요가 없습니다. –

답변

2

당신은 커서를 표시하기 위해 자신의 맨 앞면 윈도우를 생성 할 것입니다.

UpdateLayeredWindow()과 32 비트 RGBA 비트 맵을 사용하여 모든 커서가 올바르게 보이게하려면 아마도 layered window이어야합니다.

사용자가 제어하는 ​​특정 커서 만 사용하는 경우 알파 채널이 없으면 WM_ERASEBKGND 또는 WM_PAINT 메시지 처리기에서 이미지를 그대로 창에 그려서 일부 작업을 절약 할 수 있습니다. SetLayeredWindowAttributes(..., LWA_COLORKEY, ...)을 사용하여 창 투명도 색상을 설정하십시오.

+0

질문을 업데이트했습니다. 나는 이걸 가지고있어 미안해, 이거 진짜 멍청이야. 이것은 제목 표시 줄과 함께 빈 버튼을 보여줍니다, 나는 그 순간에 정상에 있다는 것에 대해 걱정하지 않습니다. 어떻게 아이콘/커서로 만들 수 있습니까? 어떻게 아이콘을 배치합니까? 좀 편집 해 주시겠습니까? 또한, 대단히 감사합니다. – turmuka

+1

@turmuka 윈도우 클래스를 등록하고 [WM_PAINT] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd162487(v=vs.85).aspx)에 커서를 그려야합니다. LWA_COLORKEY 색상으로 배경을 페인트합니다. – Anders

+0

제목 표시 줄을 제거하려면 어떻게해야합니까? @Ander – turmuka