Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Куда-то мышку потерял... и меняем цвета кнопок


Автор: neosapient 11.10.2006, 20:26
Имею Windows, VC7.
Код программы.
Код

#include <windows.h>
#include <stdio.h>
#include "resource.h"

HINSTANCE hInst;                                // current instance

LRESULT CALLBACK PlayBox(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

#define MY_ID_BUTTON 10000

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    hInst = hInstance;
    return    (int)DialogBox(hInst, (LPCTSTR)IDD_PLAYBOX, NULL, (DLGPROC)PlayBox);
}

LRESULT CALLBACK PlayBox(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    int i,j;
    HWND hButton;
    switch (message)
    {
    case WM_INITDIALOG:
        for(j=0;j<10;j++)
            for(i=0;i<10;i++)
                hButton = CreateWindow("button", "", WS_VISIBLE | WS_CHILD, 10+20*i, 10+20*j, 20, 20, hDlg, (HMENU)(MY_ID_BUTTON+j*10+i), hInst, NULL);
        ShowWindow(hButton,SW_SHOW);
        break;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDCANCEL:
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        case MY_ID_BUTTON:
            MessageBox(hDlg, "кнопка нажата", "title", MB_OK);
            break;
        }
        break;
    case WM_NOTIFY:

        break;
    case WM_MOUSEMOVE: 
        char buf[40];
        int xPos, yPos;
        xPos = LOWORD(lParam); 
        yPos = HIWORD(lParam); 
        sprintf(buf,"x=%i, y=%i",xPos,yPos);
        SetDlgItemText(hDlg,IDC_STATIC1,buf);

        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return FALSE;
}


resource.rc
Код

IDD_PLAYBOX DIALOGEX 0, 0, 186, 157
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | 
    WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    PUSHBUTTON      "Cancel",IDCANCEL,148,24,31,14
    LTEXT           "Static",IDC_STATIC1,33,134,108,16
END

resource.h
Код

#define IDD_DIALOG1                     101
#define IDD_PLAYBOX                     101
#define IDC_STATIC1                     1001


Здесь появляется диалоговое окно, в котором при инициализации создается сто кнопок. Ниже статик-окно, в котором отображаются координаты мышки. Но при наводе на дочерний контрол, сообшения главному диалогу не посылаются. 
Вопрос: как определить над какой кнопкой висит указатель мыши? 
Можно ли заставить дочернее окно (кнопку) отправлять сообщение к родительскому окну, что на кнопку навели мышь, по кнопке щелкни ли? Наверно, родительскому окну посылается WM_NOTIFY? Но по конкретнее можно?
И как зная ID кнопки, заставить ее сменить цвет с умолчательного на желты и обратно?

Добавлено @ 20:33 
 smile 

Автор: neosapient 11.10.2006, 20:45
А как пользоваться TrackMouseEvent()

Автор: neosapient 12.10.2006, 08:11
Какой-то баг в приложении...
Код

'TRACKMOUSEEVENT' : undeclared identifier
'TME_LEAVE' : undeclared identifier
'TrackMouseEvent': identifier not found, even with argument-dependent looku


Почему структура TRACKMOUSEEVENT и функция TrackMouseEvent() не компилятся.
Ведь инклужу #include <windows.h>

Автор: neosapient 12.10.2006, 09:25
По поводу примера, что только что давал.
Надо было вставить
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")

(только что то мой MSDN поэтому поводу молчал).

И еще ошибка, два раза в switch`e вызывал WM_MOUSEMOVE.
Во втором случае надо WM_MOUSELEAVE

Исправленый пример в приложении.
------------
[off topic]
Ау-у-у-у-у, повымирали все что ль  smile 
[/off topic] 

Автор: neosapient 12.10.2006, 11:15
Цитата

Как пользоваться TrackMouseEvent() ?

http://www.rsdn.ru/article/qna/ui/mouseout.xml


------------
[off topic]
Да, повымирали  smile     smile 
[/off topic]

Добавлено @ 11:26 
Нет, всё не то.

Как заставить дочерние кнопки отсылать сообщения родительскому окну, от том что на нее - кнопку - навели мышь, увели мышь, левой (правой) кнопкой мыши щелкнули по кнопке

 smile  smile 

Автор: neosapient 12.10.2006, 12:49
Открыл другую ветку форума на другом форуме:http://rusfaq.ru/?Step=info&Action=Question&ID=58655
Там пока посоветовали subclassing; пошел искать;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)