Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: CListCtrl Editlabel  (Прочитано 16062 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 09-09-2004 12:05 » 

Gospoda, pomogite pogalujsta !

 U menja est Dialog, w kotorom w swoju ochered est CListCtrl (wnesennij s pomoshju Wizarda) s atributami
 LVS_REPORT , LVS_EDITLABELS , LVS_SHOWSELALWAYS (opjat ge wse eti swojstwa otmecheni w wizarde).
 Mne nugno imet wozmognost wnosit moj text w eti EditBoxi. I wse pochti uge rabotaet, no :  perwaja bukwa wsegda propadaet!  Я шокирован!
 T.e ja w handlere OnKeydownList etogo CListCtrla otlawliwaju nagatie bukw i zifr i dlja nih zatem
 (CListCtrl*)GetDlgItem(IDC_LIST3)->EditLabel( nSelectedItemIndex )
 Resultat - ja mogu pisat text w okoshke, no perwaja nagataja bukwa w okoshke ne wiswechiwaetsja ;-(  Так больше нельзя...
 A pochemu - nikak ne pojmu. Pitalas etomu EditBoxu SendMessage(WM_KEYDOWN, ..) posilat, a on wse rawno etu bukwu ne hochet   Ха-ха-ха
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
SOS
Гость
« Ответ #1 : 09-09-2004 16:47 » 

Привет Улыбаюсь

Дело в том что в OnKeydownList приходит virtual key а не код буквы, т.е Shift, Ctrl, ... придут каждое нажатие отдельно. Буквы виртуальны и только заглавные.
Если заглавные достаточно то проверь их так:
Код:
// 0=48, 1=49,...,9=57
// A=65,...,Z=90
int iV_Kiey_Low = 65;
int iV_Kiey_UP = 90;

if((pLVKeyDow->wVKey >= iV_Kiey_Low)&&(pLVKeyDow->wVKey <= iV_Kiey_UP))
{
......
}
При этом надо сохранить букву , а потом клеить к строке.
Я бы начинал edit по NM_DBLCLK.
« Последнее редактирование: 01-12-2007 13:54 от Алексей1153++ » Записан
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 10-09-2004 07:07 » 

SOS,

ponimaesh, ja eto sdelala. Delo w tom, chto ja hotela, chtobi wse shlo po sledujushej sheme :
- onclick na nugnoj stroke awtomaticheski ee wideljaet
- a zatem pri nagatii ljuboj nugnoj bukwi srazu ge nachinaem redaktirowat

T.e. eto imeet wid :

Код:
void ListView::OnKeydownList3(NMHDR* pNMHDR, LRESULT* pResult) 
{
    bool bIsOk = true;
    LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
    UINT nListSelectedItem = 0;

    if ( (pLVKeyDow->wVKey >= 65 && pLVKeyDow->wVKey <= 90) ||
         (pLVKeyDow->wVKey >= 49 && pLVKeyDow->wVKey <= 57) ||
         (pLVKeyDow->wVKey >= 96 && pLVKeyDow->wVKey <= 105) )
    {
        bIsOk = prepareForEdit(pLVKeyDow->wVKey);
    }
    else if (pLVKeyDow->wVKey == 46)
    {
        // if  "delete"
        CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST3);
        nListSelectedItem = GetSelectedItem();

        POSITION p = pList->GetFirstSelectedItemPosition();
        if ( p )
        {
            pList->DeleteItem( nListSelectedItem );
        }
    }
   
*pResult = 0;
}

bool ListView::prepareForEdit(WORD nKeyCode)
{
    int nCount = 0;
    UINT nListSelectedItem = 0;

    CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST3);
    pList->SetFocus();

    // To Use EditCtrl on the ListView it must have the Style LVS_EDITLABELS
    if ( pList->GetStyle() & LVS_EDITLABELS )
    {
        // don't do an Edit Label when the multiple Items are selected
        if( pList->GetSelectedCount( ) == 1 )
        {
            nListSelectedItem = GetSelectedItem();
            if ( pList->EditLabel( nListSelectedItem ) != NULL )
            {
                m_nListSelectedItem = nListSelectedItem;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
    return true;
}


T.e. pri nagatii bukwi ili zifri wiziwaetsja funkzija, aktiwirujushaja EditBox. No sama bukwa pri etom prozesse propadaet.
Ja pitalas poslat etomu EditBoxu sama SendMessage(wm_keydown), no reakzija nulewaja  Так больше нельзя...
« Последнее редактирование: 01-12-2007 13:54 от Алексей1153++ » Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 14-09-2004 10:14 » 

Цитата: Malaja
No sama bukwa pri etom prozesse propadaet.


Всё правильно, ты же её сама и проглатываешь:

prepareForEdit(WORD nKeyCode) получает  nKeyCode, но ничего с ним не делает.  Так больше нельзя...  Можно сохранить его в мембере, а потом в OnBeginLabelEdit сразу вставить
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #4 : 14-09-2004 11:51 » 

Джон,


spasibo! Ja pitalas etot simwol ispolzowat, poslaja SendMessage :
   pList->GetEditControl()->SendMessage(WM_KEYDOWN, nKeyCode, 10);
prosto nado bilo wmesto WM_KEYDOWN poslat WM_CHAR Отлично

No teper eshe odin woprosik :  :oops:
 w void ListView::OnKeydownList3 opredelena LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
Sama LV_KEYDOWN :
typedef struct tagLVKEYDOWN {
    NMHDR hdr;
    WORD  wVKey;
    UINT  flags;
} NMLVKEYDOWN, FAR *LPNMLVKEYDOWN;

T.e u menja est tolko wVKey, a eto znachit, chto pri nagatii bukwi 'A' wVKey=65 wne zawisimosti ot registra, t.e. pri prostom ispolzowanii wVKey w okne wsegda budet stojat 'A'.
Kak prowerit, kakoj registr na dannij moment wkljuchen, t.e. nagat li CapsLock ili Shift?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 14-09-2004 13:12 » 

Посмотри ф-ю GetKeyState, параметр интересующая тебя клавиша

#define VK_NUMLOCK        0x90
#define VK_SCROLL         0x91
#define VK_LSHIFT         0xA0
#define VK_RSHIFT         0xA1
#define VK_LCONTROL       0xA2
#define VK_RCONTROL       0xA3
#define VK_LMENU          0xA4
#define VK_RMENU          0xA5

Кстати, немецкую "Alt Gr" я так и не знаю.  :new_shot:
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #6 : 15-09-2004 06:54 » 

Джон,

spasibo za pomosh - ja pro etu funkziju woobshe zabila :oops:


Po powodu
Цитата

немецкую "Alt Gr"

posmotri : http://www.terms.de/german/97801/t_doku12/a2.htm
Ja prowerila - pri ee nagatii dejstwitelno prihodjat po ocheredi 2 wm_keydowm : odin raz s VK_Control (Ctrl) i zatem s VK_MENU (Alt). Kuda denesh'sja - bred polnij   Ха-ха-ха
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 15-09-2004 07:06 » 

"Что это за импровизация такая? Кто её выдумал? Наверное немцы. Вечно они чего нибудь придумают, а русскому человеку мучайся." (с) к/ф "Мы из джаза"
Очень часто приходится убеждаться в справедливости вышесказанного. Ну вот надо было им всё переводить? И принтер, и клаву, и даже кнопки  :new_shot:
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 15-09-2004 07:47 » 

Джон,

polnostju soglasna. Uge 7 let postojanno ubegdajus w tom, chto oni wse ljubjat na swoj lad naziwat i perestraiwat. No samoe zabawnoe (i eto uteshaet  :twisted: ), chto mestnie s etim toge muchajutsja i ja reguljarno slishu na etu temu wse, chto oni ob etom dumajut  Улыбаюсь

U menja tut eshe odin wopros nazrel - ne serdites wse :oops:
Funkzija GetKeyState spasaet w sluchae, kogda ti nagal klawishu , a potom otpustil. Naprimer, dlja capslock - ok, esli ona nagata, to wse bukwi awtomatom perewodjatsja w bolshie i loword(GetKeyState) wozwrashaet 1.
Esli ge rech idet o shift, to dlja poluchenija rezultat ee nado dergat w nagatom sostojanii. No funkzija wozwrashaet pri etom status=-127! t.e. proishodit perepolnenie...
esli dergat capslock nagatoj, resultat takoj ge  Жаль  t.e. loword i hiword rawni kakim-to bredowim chislam. Wopros - chto wse eto znachit???
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 15-09-2004 10:16 » 

Ааа,  ну так тебе надо анализировать возвращённое значение. MSDN есть?
Ща выдержку приведу:

Return Value

The return value specifies the status of the specified virtual key, as follows:

If the high-order bit is 1, the key is down; otherwise, it is up.
If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 15-09-2004 10:25 » 

Подожди, А почему они у тебя -127?  ведь возвращаестя SHORT. Покажи код, как ты это делаешь.

зы Может так получится, что я тут сегодня больше не появлюсь, поэтому вот что я имею ввиду:
у тебя должно получится что-нить типа

0хff81
1111 1111  1000 0001 - интересующие нас биты

SHORT sh = ::GetKeyState(VK_LCONTROL);
if((sh&0x80)==0x80) //
{
   // key down
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #11 : 15-09-2004 12:05 » 

Джон,

u menja bil wkljuchen pokaz w desjatichnoj sisteme, posemu pojawljalos -127, esli wkljuchit hex, to widen  0хff81.
Ja sdelala tak :
Код:
                SHORT nState = GetKeyState(VK_SHIFT);
                if (HIWORD(nState) == 1)   
                {
                    bIsShift = true;
                }
                else
                {
                    bIsShift = false;
                }

t.k. naskolko ja ponimaju, LOWORD HIWORD prowerjajut nugnie nam biti (nu ne ljublju ja pobitowuju arifmetiku i wsju gizn s nej putajus   Ха-ха-ха )

S tem kodom, kotorij ti mne pokazal, wse horosho dlja caps locka (werhnij bit d.b. wkljuchen). Ja sdelala sama lja shifta (nam nugen mladshij bit) - ne rabotaet  Жаль :

                if(nState == 0x80)
                    bIsCapsLock = true;
                else
                    bIsCapsLock = false;

a chto tut ne tak - ponjatija ne imeju (widno opjat chto-to ne tuda sdwinula)
« Последнее редактирование: 01-12-2007 13:56 от Алексей1153++ » Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 15-09-2004 15:06 » 

Ошибка в том, что ты проверяешь результат, а не бит.
Код:
SHORT nState = GetKeyState(VK_SHIFT);
if (HIWORD(nState) == 1)
....
  
работает только для toggle бита (см ниже) - 0х01

например будет фальш, если даже у тебя шифт находится в ON, но при этом ещё и нажат. те результат будет 0х81 != 1

или наоборот если он у тебя был "включен", то при послед. нажатии и ужержании он перейдёт в toggle off тогда будет ситуация 0х80!=1 хотя кнопка нажата.

Для того, чтоб определить, нажат Shit или нет тебе нужен только старший бит - 0х80


Значица так, опрашиваем биты

для Shift

Код:
	sh = ::GetKeyState(VK_LSHIFT);
if((sh&0x80)==0x80) // проверка старшего бита - 1 кнопка нажата 0 - отпущена
{
TRACE0("Left Shift down\n");
}
else
{
TRACE0("Left Shift button up\n");
}

младший бит проверять у него не имеет смысла тк это переключатель - toggle.
Те он переключается через 2 нажатия. Можешь посмотреть:

   
Код:
if((sh&0x01)==0x01) // проверка состояния переключателя - toggle
{
TRACE0("Left Shift is ON\n");
}
else
{
TRACE0("Left Shift is OFF\n");
}

Для Caps совсем наоборот, от него нам нужен именно toggle бит, тк сама кнопка может быть отпущена в этот момент

Код:
	SHORT sh = ::GetKeyState(VK_CAPITAL);
if((sh&0x80)==0x80) // просто посмотреть нажата ли кнопка или нет
{
TRACE0("CapsLock down\n");
}
else
{
TRACE0("CapsLock up\n");
}

if((sh&0x01)==0x01) // !!!!! а здесь её состояние
{
TRACE0("CapsLock is ON\n");
}
else
{
TRACE0("CapsLock is OFF\n");
}

Но и опять таки НИ В КОЕМ СЛУЧАЕ НЕ ПРОВЕРЯТЬ на равенство 1.
если он был выключен и кнопка отпущена - 0х00. Теперь нажимаем Caps и удерживаем - ситуация - 0х81 != 1 хотя он включен и буквы должны быть заглавными.

Поэтому единственно правильным является использование бинарной И
ну и чтоб совсем "чисто" было - сравнить результат с образцом.
« Последнее редактирование: 01-12-2007 13:58 от Алексей1153++ » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #13 : 16-09-2004 12:46 » 

Джон,

spasibochki, teper ponjala! Отлично
Ja po swoej durosti dumala, chto eti funkzii sostojanie bitow oprashiwajut   Так больше нельзя...
Wse rabotaet!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines