Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

CListBox и клавиша ENTER

472
10 августа 2005 года
Vovka
139 / / 10.02.2005
Пробовал через NM_THEMECHANGED, но при компиляции выдается ошибка:
error C2065: 'NM_THEMECHANGED' : undeclared identifier
хотя в файле commctrl.h есть его определение:
#if (_WIN32_IE >= 0x0500)
#define NM_THEMECHANGED (NM_FIRST-22)
#endif

Я так понимаю, что _WIN32_IE не то...

Как быть?
406
10 августа 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Vovka
Пробовал через NM_THEMECHANGED, но при компиляции выдается ошибка:
error C2065: 'NM_THEMECHANGED' : undeclared identifier
хотя в файле commctrl.h есть его определение:
#if (_WIN32_IE >= 0x0500)
#define NM_THEMECHANGED (NM_FIRST-22)
#endif

Я так понимаю, что _WIN32_IE не то...

Как быть?



перед определением у себя в проекте commctrl.h пиши
#define _WIN32_IE 0x0500

472
10 августа 2005 года
Vovka
139 / / 10.02.2005
Цитата:
Originally posted by vitaly2003s
перед определением у себя в проекте commctrl.h пиши
#define _WIN32_IE 0x0500



commctrl.h - это не мой файл, а VC7.0
Пробовал вставлять определение #define _WIN32_IE 0x0500 - куча ошибок

406
10 августа 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Vovka
commctrl.h - это не мой файл, а VC7.0
Пробовал вставлять определение #define _WIN32_IE 0x0500 - куча ошибок


Я знаю что commctrl.h не твой файл.
Я имел ввиду чтобы ты где то в своем основном заголовочном файле определил так
//main.h
#pragma once
#include <windows.h>
#define _WIN32_IE 0x0501
#include <commctrl.h>
.....

472
11 августа 2005 года
Vovka
139 / / 10.02.2005
Цитата:
Originally posted by vitaly2003s
Я знаю что commctrl.h не твой файл.
Я имел ввиду чтобы ты где то в своем основном заголовочном файле определил так
//main.h
#pragma once
#include <windows.h>
#define _WIN32_IE 0x0501
#include <commctrl.h>
.....


Пробовал - безрезультатно...
Даже заменял в файле commctrl.h на 0x0501...

406
11 августа 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Vovka
Пробовал - безрезультатно...
Даже заменял в файле commctrl.h на 0x0501...


Весь проект свой кинь сюда в архиве,посмотрю. И еще какая у тебя операционка и какая версия IExplorer?

472
11 августа 2005 года
Vovka
139 / / 10.02.2005
Цитата:
Originally posted by vitaly2003s
Весь проект свой кинь сюда в архиве,посмотрю. И еще какая у тебя операционка и какая версия IExplorer?


Windows XP Home Edition v2002 SP2
IE версии 6.0.2900.... и дальше текст:D

488
11 августа 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Vovka
Windows XP Home Edition v2002 SP2
IE версии 6.0.2900.... и дальше текст:D

В stdafx.h поменяй значение константы

#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE [color=red]0x0500[/color] // Change this to the appropriate value to target IE 5.0 or later.
#endif

472
11 августа 2005 года
Vovka
139 / / 10.02.2005
Цитата:
Originally posted by Mоngооsе
В stdafx.h поменяй значение константы

#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE [color=red]0x0500[/color] // Change this to the appropriate value to target IE 5.0 or later.
#endif


Спасибо, разобрался. Оказывается я не тот stdafx.h редактировал!
У меня в проекте CListBox в DLL, а я редактировал stdafx.h главного модуля!

Ошибка-то пропала, а вот NM_THEMECHANGED на нажатие ENTER, да и других клавиш не обрабатывается!
CListBox заполнен. Может еще чего нужно переопределить?

488
11 августа 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Vovka
Ошибка-то пропала, а вот NM_THEMECHANGED на нажатие ENTER, да и других клавиш не обрабатывается!
CListBox заполнен. Может еще чего нужно переопределить?


Чтоб словить ENTER нужно переопределить OnOk() для диалогового окна.

472
11 августа 2005 года
Vovka
139 / / 10.02.2005
Цитата:
Originally posted by Mоngооsе
Чтоб словить ENTER нужно переопределить OnOk() для диалогового окна.


OnOk() переопределена, но как я узнаю, где была нажата клавиша ENTER, если у меня два CListBox и один CComboBox??? Потом мне нужно отлавливать нажатие клавиши, допустим, А.

488
11 августа 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Vovka
OnOk() переопределена, но как я узнаю, где была нажата клавиша ENTER, если у меня два CListBox и один CComboBox??? Потом мне нужно отлавливать нажатие клавиши, допустим, А.

Можно напр.

 
Код:
void CTestDlgDlg::OnOK()
{
  CWnd *pWnd = GetFocus();
  int id = pWnd->GetDlgCtrlID();
  if(id==IDC_LIST1)
    AfxMessageBox("LIST1");
}
На счет "A" можно бы переопределить PreTranslateMessage
 
Код:
BOOL CTestDlgDlg:: PreTranslateMessage(MSG* pMsg)
{
  if(pMsg->message==WM_CHAR && pMsg->wParam == 'A')
  {
      AfxMessageBox("A");
      return TRUE;
  }
  return CDialog:: PreTranslateMessage(pMsg);
}
472
12 августа 2005 года
Vovka
139 / / 10.02.2005
Появилась очередная проблема!
Когда двойным кликом мышки в списке CListBox я вызывал меню все работало:

CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN, pos.x, pos.y, this);

А теперь при обработке клавиши ENTER меню выскакивает в позиции, где был клик мышкой.
Т.е.если я кликнув мышкой на первой позиции списка вызвал меню, потом, закрыв меню, клавишами переместил курсор на несколько строк вниз и нажал ENTER, то меню появляется относительно первой строки, а не той, где я нажал ENTER.
Как теперь мне получить позицию для вывода PopUp-меню?
488
12 августа 2005 года
Mоngооsе
465 / / 01.04.2005
Считаешь, что это OnOK картину портит, а не то что Popup меню выводишь в позиции курсора?

Тогда убери OnOK. Enter можно словить и в PreTranslateMessage
Код:
BOOL CTestDlgDlg:: PreTranslateMessage(MSG* pMsg)
{
  if(pMsg->message==WM_CHAR && pMsg->wParam == 'A')
  {
      AfxMessageBox("A");
      return TRUE;
  }
  if(pMsg->message==WM_KEYUP && pMsg->wParam == VK_RETURN)
  {
    CWnd *pWnd = GetFocus();
    int id = pWnd->GetDlgCtrlID();
    if(id==IDC_LIST1)
    AfxMessageBox("LIST1");
  }
  return CDialog:: PreTranslateMessage(pMsg);
}
Но лучше посмотри CListBox GetItemRect.
472
12 августа 2005 года
Vovka
139 / / 10.02.2005
OnOk() удалять нельзя - на ENTER будет закрываться окно.
С PreTranslateMessage(MSG* pMsg) тоже не получилось меню появляется там, где находится указатель мышки!
А вот с CListBox GetItemRect неуловлю мысль: ведь GetItemRect возвращает размеры прямоугольника
выбранной строки. А эта строка может быть первой видимой или ниже. А как привязаться к координатам?
488
12 августа 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Vovka
А вот с CListBox GetItemRect неуловлю мысль: ведь GetItemRect возвращает размеры прямоугольника
выбранной строки. А эта строка может быть первой видимой или ниже. А как привязаться к координатам?

 
Код:
int nIndex = ListBox->GetCurSel();
RECT r;
ListBox->GetItemRect(nIndex, &r); //Координаты выбранного элемента.
...
pMenu->TrackPopupMenu(TPM_LEFTALIGN, r.left+4, r.top-2, this);
Но, на всякий случай, нужно бы проверить, что r.top и r.bottom находятся внутри ListBox.
Т.е. r.top>0, и r.bottom<"listbox.bottom".
Если нет, тогда наверно лучше ничего не выводить.
И нужно преобразовать координаты, так как позиция элемента задается относительно listbox-a.
472
12 августа 2005 года
Vovka
139 / / 10.02.2005
br /> И нужно преобразовать координаты, так как позиция элемента задается относительно listbox-a.


Почти получилось... А как привязаться к координатам CListBox-а?

488
12 августа 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Vovka
Почти получилось... А как привязаться к координатам CListBox-а?

 
Код:
CListBox *pLB = (CListBox *)GetDlgItem(IDC_LIST1);
RECT r;
pLB->GetItemRect(pLB->GetCurSel(), &r);
int yPos = r.top;
if(yPos<0)return;
pLB->GetWindowRect(&r);
this->ScreenToClient(&r);
if(r.bottom<yPos)return;
pMenu->TrackPopupMenu(TPM_LEFTALIGN, r.left+4, r.top+2, this);
472
12 августа 2005 года
Vovka
139 / / 10.02.2005
Цитата:
Originally posted by Mоngооsе
 
Код:
CListBox *pLB = (CListBox *)GetDlgItem(IDC_LIST1);
RECT r;
pLB->GetItemRect(pLB->GetCurSel(), &r);
int yPos = r.top;
if(yPos<0)return;
pLB->GetWindowRect(&r);
this->ScreenToClient(&r);
if(r.bottom<yPos)return;
pMenu->TrackPopupMenu(TPM_LEFTALIGN, r.left+4, r.top+2, this);


Срасибо, работает! Правда немножко подредактировал:

 
Код:
CListBox *pLB = (CListBox *)GetDlgItem(IDC_LIST2);
        RECT r,r2;
        pLB->GetItemRect(pLB->GetCurSel(), &r);
        if(r.top<0) return;
        pLB->GetWindowRect(&r2);
        if(r2.bottom<r.top) return;
        pMenu->TrackPopupMenu(TPM_LEFTALIGN, r.left+r2.left+10, r.bottom+r2.top+2, this);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог