powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Чуть модифицировать Color Common Dialog
3 сообщений из 3, страница 1 из 1
Чуть модифицировать Color Common Dialog
    #38280310
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача такая.
Есть форма, на ней Picturebox.
Надо чтоб пользователь мог задавать его цвет (как ему нравится).

Хочу сделать: пользователь щелкает правой кнопкой мыши по панельке (ну или DoubleClick), появляется окно Color, он задает цвет.
Ну, естественно в стандартном виде сделал.

Задачи:
1. поменять текст заголовка окна Color
2. вывести кнопку Help, написать на ней Reset (дефолтный цвет)
3. при нажатии на Help закрывать окно и сбрасывать цвет на дефолтный
4. окно должно выводиться в районе Picturebox, а не рядом с заголовком формы.

(Иначе все это не очень красиво выглядит)

Думал справлюсь с ходу.
Почему думал, потому что есть хороший опыт с Open/Save.
Но не тут то было.

>1. поменять текст заголовка окна Color
Стандартно задать нельзя.
Но справился.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  C.Flags = Flags& Or CC_RGBINIT Or CC_SHOWHELP Or CC_ENABLEHOOK
  C.lpfnHook = FARPROC(AddressOf CCHookProc)

Public Function CCHookProc(ByVal hwnd As Long, _
                           ByVal uMsg As Long, _
                           ByVal wParam As Long, _
                           ByVal lParam As Long) As Long
  
  Dim hWndParent As Long

  Select Case uMsg
    Case WM_INITDIALOG
      Debug.Print "WM_INITDIALOG"
      hWndParent = GetParent(hwnd) '??? а нужен ли такой (если SetWindowText hwnd)
      SetWindowText hwnd, "Change Panel Color"
      Call SendMessage(hwnd, CDM_SETCONTROLTEXT, ID_HELP, ByVal "Reset") 'не работает
    Case Else
  End Select
End Function


Причем сразу обратил внимание, что получилось с SendMessage(hwnd а не с hWndParent
>2. вывести кнопку Help, написать на ней Reset
Вывел, но CDM_SETCONTROLTEXT (где Private Const ID_HELP = &H40E 'Help Button)
не работает (хотя по MSDN с Color вроде как и не должно, там Open/Save упомянаются, но как то нечетко). С Open/Save это работало. Пробовал hwnd, hWndParent ID_CANCEL для проверки - не помогает.
Конечно могу попробовать FindWindow(кнопка)+SetWindowText, но фиг ее знает - на китайском Help по-другому пишется.
Т.е. как -то надо найти ID_HELP.
>3. Как ID_HELP нажать, т.е. вставить код при нажатии.
Для Open/Save
Код: vbnet
1.
       Case CDN_HELP 'Help clicked


Но здесь это кажется хитрее делается, пока не понял.
>4. окно должно выводиться в районе Picturebox, а не рядом с заголовком формы.
Пытался по простому.
Код: vbnet
1.
  C.hWndOwner = myForm.hwnd


выводит Color под заголовком myForm,
а у меня панель справа - далеко очень выводится

Пробовал
Код: vbnet
1.
  C.hWndOwner = myForm.Picturebox1.hwnd

-не хочет перемещать.

Что, только сабклассить, делать SetWindowPos и при этом смотреть "Где Taskbar?", чтоб не вылезла за экран? Ну, в принципе с Open/Save я такое делал, но хотелось нахаляву.
...
Рейтинг: 0 / 0
Чуть модифицировать Color Common Dialog
    #38281023
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну в принципе все делается через
Код: vbnet
1.
2.
3.
4.
  C.Flags = Flags& Or CC_RGBINIT Or CC_SHOWHELP Or CC_ENABLEHOOK
  C.lpfnHook = FARPROC(AddressOf CCHookProc)
Private Function CCHookProc(ByVal hwnd As Long, _
...


2. вывести кнопку Help, написать на ней Reset (дефолтный цвет)
Код: vbnet
1.
2.
3.
    Case WM_INITDIALOG
      hItem = GetDlgItem(hwnd, ID_HELP)
      SetWindowText hItem, "Default" 'надпись на кнопке ID_HELP


3. при нажатии на Help закрывать окно и сбрасывать цвет на дефолтный
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
     Case WM_COMMAND
      LW_wParam = LowOrd(wParam)
      HW_wParam = HIWORD(wParam)
      'The LOWORD contains the button's control identifier. The HIWORD specifies the notification code
      If (HW_wParam = BN_CLICKED) And (LW_wParam = ID_HELP) Then 'код при нажатии ID_HELP
        'Debug.Print "Help button clicked"
        Form1.Picture1.BackColor = vbApplicationWorkspace
        SendMessage hwnd, WM_CLOSE, 0, 0
      End If



4. окно должно выводиться в районе Picturebox, а не рядом с заголовком формы.
Это пожалуй самое муторное с учетом того чтоб не залезала под Taskbar.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
    Case WM_SHOWWINDOW
      SetColorDialogPosition hwnd
...

Private Sub SetColorDialogPosition(ByVal hwnd As Long)
  Dim rc As RECT 'rc-это диалог
  Dim rc_pic As RECT 'rc_pic-это Picture1, цвет кот. меняем, где хотим отображать диалог
  Dim dx As Long, dy As Long
 ...  
  GetWindowRect hwnd, rc ' Color Dialog (как его хочет вывести система)
  GetWindowRect Form1.Picture1.hwnd, rc_pic 'Picture1
  
  dx = rc.Right - rc.Left
  dy = rc.Bottom - rc.Top
  rc.Left = rc_pic.Left + 10
  rc.Top = rc_pic.Top + 10
  rc.Right = rc.Left + dx
  rc.Bottom = rc.Top + dy
  
  '==========================================================================
  'нужен код исправления, чтоб диалог не попадал за пределы экрана
...
  'DeltaX,DeltaY -поправки относительно Taskbar
  '+5-делаем диалог чуть шире, иначе ID_HELP оч. близко к правому краю формы
  SetWindowPos hwnd, 0, _
   rc.Left + DeltaX, _
   rc.Top + DeltaY, _
   rc.Right - rc.Left + 5, _
   rc.Bottom - rc.Top, 0
End Sub
...
Рейтинг: 0 / 0
Чуть модифицировать Color Common Dialog
    #38281024
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Чуть модифицировать Color Common Dialog
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]