CListBox и клавиша ENTER
error C2065: 'NM_THEMECHANGED' : undeclared identifier
хотя в файле commctrl.h есть его определение:
#if (_WIN32_IE >= 0x0500)
#define NM_THEMECHANGED (NM_FIRST-22)
#endif
Я так понимаю, что _WIN32_IE не то...
Как быть?
Пробовал через 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
перед определением у себя в проекте commctrl.h пиши
#define _WIN32_IE 0x0500
commctrl.h - это не мой файл, а VC7.0
Пробовал вставлять определение #define _WIN32_IE 0x0500 - куча ошибок
commctrl.h - это не мой файл, а VC7.0
Пробовал вставлять определение #define _WIN32_IE 0x0500 - куча ошибок
Я знаю что commctrl.h не твой файл.
Я имел ввиду чтобы ты где то в своем основном заголовочном файле определил так
//main.h
#pragma once
#include <windows.h>
#define _WIN32_IE 0x0501
#include <commctrl.h>
.....
Я знаю что commctrl.h не твой файл.
Я имел ввиду чтобы ты где то в своем основном заголовочном файле определил так
//main.h
#pragma once
#include <windows.h>
#define _WIN32_IE 0x0501
#include <commctrl.h>
.....
Пробовал - безрезультатно...
Даже заменял в файле commctrl.h на 0x0501...
Пробовал - безрезультатно...
Даже заменял в файле commctrl.h на 0x0501...
Весь проект свой кинь сюда в архиве,посмотрю. И еще какая у тебя операционка и какая версия IExplorer?
Весь проект свой кинь сюда в архиве,посмотрю. И еще какая у тебя операционка и какая версия IExplorer?
Windows XP Home Edition v2002 SP2
IE версии 6.0.2900.... и дальше текст:D
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
В 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 заполнен. Может еще чего нужно переопределить?
Ошибка-то пропала, а вот NM_THEMECHANGED на нажатие ENTER, да и других клавиш не обрабатывается!
CListBox заполнен. Может еще чего нужно переопределить?
Чтоб словить ENTER нужно переопределить OnOk() для диалогового окна.
Чтоб словить ENTER нужно переопределить OnOk() для диалогового окна.
OnOk() переопределена, но как я узнаю, где была нажата клавиша ENTER, если у меня два CListBox и один CComboBox??? Потом мне нужно отлавливать нажатие клавиши, допустим, А.
OnOk() переопределена, но как я узнаю, где была нажата клавиша ENTER, если у меня два CListBox и один CComboBox??? Потом мне нужно отлавливать нажатие клавиши, допустим, А.
Можно напр.
{
CWnd *pWnd = GetFocus();
int id = pWnd->GetDlgCtrlID();
if(id==IDC_LIST1)
AfxMessageBox("LIST1");
}
{
if(pMsg->message==WM_CHAR && pMsg->wParam == 'A')
{
AfxMessageBox("A");
return TRUE;
}
return CDialog:: PreTranslateMessage(pMsg);
}
Когда двойным кликом мышки в списке CListBox я вызывал меню все работало:
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN, pos.x, pos.y, this);
А теперь при обработке клавиши ENTER меню выскакивает в позиции, где был клик мышкой.
Т.е.если я кликнув мышкой на первой позиции списка вызвал меню, потом, закрыв меню, клавишами переместил курсор на несколько строк вниз и нажал ENTER, то меню появляется относительно первой строки, а не той, где я нажал ENTER.
Как теперь мне получить позицию для вывода PopUp-меню?
Тогда убери OnOK. Enter можно словить и в PreTranslateMessage
{
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);
}
С PreTranslateMessage(MSG* pMsg) тоже не получилось меню появляется там, где находится указатель мышки!
А вот с CListBox GetItemRect неуловлю мысль: ведь GetItemRect возвращает размеры прямоугольника
выбранной строки. А эта строка может быть первой видимой или ниже. А как привязаться к координатам?
А вот с CListBox GetItemRect неуловлю мысль: ведь GetItemRect возвращает размеры прямоугольника
выбранной строки. А эта строка может быть первой видимой или ниже. А как привязаться к координатам?
RECT r;
ListBox->GetItemRect(nIndex, &r); //Координаты выбранного элемента.
...
pMenu->TrackPopupMenu(TPM_LEFTALIGN, r.left+4, r.top-2, this);
Т.е. r.top>0, и r.bottom<"listbox.bottom".
Если нет, тогда наверно лучше ничего не выводить.
И нужно преобразовать координаты, так как позиция элемента задается относительно listbox-a.
Почти получилось... А как привязаться к координатам CListBox-а?
Почти получилось... А как привязаться к координатам CListBox-а?
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);
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);
Срасибо, работает! Правда немножко подредактировал:
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);