check-uirea mai multor butoane intr-un menubar

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

check-uirea mai multor butoane intr-un menubar

Post by black_atus » 03 Oct 2012, 14:19

Buna ziua.

Incerc sa implementez o posibilitate de a check-ui mai multe butoane intr-un menubar fara ca menubarul sa-mi dispara dupa primul click. Menubarul il am deja facut. Am un buton de view sub care pot check-ui / decheck-ui mai multe butoane de tip check box care fac sa apara sau nu niste toolbar-uri. Ca sa fac sa apara 2 toolbaruri de exemplu trebuie sa apas view si apoi pe unul din ele, meniul dispare si trebuie sa o iau de la capat pt celalalt. Am cautat vre-un flag sau metoda pentru a putea da mai multe click-uri fara sa-mi dispara menubarul dupa primul click.

Orice sugestie imi este de folos :)


Cu stima,
Daniel Constantin

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: check-uirea mai multor butoane intr-un menubar

Post by Ovidiu Cucu » 03 Oct 2012, 14:56

Cu meniul nu poti face asa ceva. Asa a fost conceput de la mama lui, sa se inchida dupa ce dai click pe un item.
Daca vrei sa check-uiesti mai multe optiuni in acelasi timp pune-le intr-un toolbar sau dialog bar sau fa un dialog de settings.

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: check-uirea mai multor butoane intr-un menubar

Post by neagu_laurentiu » 03 Oct 2012, 15:59

Vezi meniurile custom de la producatorii de componente GUI.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: check-uirea mai multor butoane intr-un menubar

Post by Ovidiu Cucu » 03 Oct 2012, 20:32

neagu_laurentiu wrote:Vezi meniurile custom de la producatorii de componente GUI.
Oare ce ne-am face noi, biete masini de scris cod si dat drag'n drop din mouse daca n-ar fi producatorii de componente GUI? :D

Deci, dupa cum am spus, nu stiu sa existe vreun stil, flag, mesaj sau notificare cu care poti sa impiedici inchiderea meniului cand userul da click pe un item. Daca exista iar cineva stie, il rog sa-mi spuna si mie.
Prima recomandare ar fi cea din primul post: lasat meniul cum este de la mama lui si folosit alte chestii: toolbar, dialog cu setari, etc. Daca totusi se vrea si se vrea neaparat, la urma urmei (aproape) orice e posibil, cu putin efort.

Trec peste carpeli gen, "simulare popup menu cu un listbox" si altele asemenea.
Un meniu popup este la urma urmei tot o fereastra iar daca gasim o metoda de a-i intercepta mesajele, atunci putem face ce vrem cu ea.
O idee ar fi sa folosim un hook tip WH_MSGFILTER care prinde mesajele de input pentu dialog box, message box, menu, si scroll bar. Presupunand ca meniul popup se inchide pe WM_LBUTTONUP cam ce am avea de facut? In principiu, simplu: in procedura hook-ului vedem daca vine un mesaj pentru menu apoi daca acest mesaj este WM_LBUTTONUP si-l schimbam cu WM_NULL.

O sa pun la punct un demo si o sa-l postez ceva mai tarziu.

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: check-uirea mai multor butoane intr-un menubar

Post by neagu_laurentiu » 03 Oct 2012, 22:56

Meniurile de care vorbesc eu nu-s cele standard, implementate de MS, ci sunt facute "de la zero" cu tot felul de giumbuslucuri pe acolo.
Daca tu ai chef de implementat in MFC o aplicatie asa cum vine in VS MFC-ul inseamna ca ori ai ca tinta piata producatorilor de care vorbesc ori timp prea mult. Eu prefer sa platesc cateva sute de euro si apoi ma concentrez la aplicatia mea nu pe inventat roata.

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: check-uirea mai multor butoane intr-un menubar

Post by Marius Bancila » 04 Oct 2012, 09:41

Pai laurentiu, Ovidiu se pune sa faca un meniu dinasta si tu sari cu cateva sute de euro pentru el. Daca mai sar vreo 2-3, cred ca s-a scos Ovidiu. Nu-i asa? :D
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: check-uirea mai multor butoane intr-un menubar

Post by neagu_laurentiu » 04 Oct 2012, 10:28

Nu e nici o problema, fiecare traieste pe segmentul sau. Insa daca ne uitam la concurenta in sutele alea se ofera mult mai mult decat un meniu.
Ideea era ca unii s-au ocupat deja de astfel de lucruri existentiale, iti dau codul sursa in caz ca vrei sa te mai bagi pe acolo si iti vezi de aplicatia ta in continuare. Cine vrea sa faca totul "in house" e liber insa managerul trage linie la final si compara.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: check-uirea mai multor butoane intr-un menu

Post by Ovidiu Cucu » 04 Oct 2012, 11:35

Da Domn Manager, de mult visez sa rescriu cap-coada MFC-ul si toate controalel din Windows, pi bani matali... :biggrin:
Dar pana acum n-am reusit decat atat:

Code: Select all

struct HOOK_INFO
{
   HHOOK hHook;          // hook handle
   HMENU hMenu;          // selected menu handle
   WORD wMenuItemID;     // selected menu item identifier
};

class CMainFrame : public CMDIFrameWnd
{
// ...
// Implementation
private:
   static LRESULT CALLBACK MessageProc(int nCode, WPARAM wParam, LPARAM lParam);
   static HOOK_INFO m_hookInfo;
   static void _HandleMenuMessage(MSG* pMSG);
//...
};

Code: Select all

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
      return -1;

   //  installs the hook procedure into a hook chain
   m_hookInfo.hHook = SetWindowsHookEx(WH_MSGFILTER, // hook type 
      &CMainFrame::MessageProc,                      // hook procedure
      NULL,                                          // module handle
      GetCurrentThreadId());                         // current thread 
   //...
}

Code: Select all

HOOK_INFO CMainFrame::m_hookInfo;

LRESULT CALLBACK CMainFrame::MessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{
   if(MSGF_MENU == nCode) // message is for a menu
   {
      MSG* pMSG = (MSG*)lParam;
      _HandleMenuMessage(pMSG);
   }
   return ::CallNextHookEx(m_hookInfo.hHook, nCode, wParam, lParam);
}

Code: Select all

void CMainFrame::_HandleMenuMessage(MSG* pMSG)
{
   switch(pMSG->message)
   {
   case WM_MENUSELECT:
      // keep in mind selected menu handle and selected item identifier
      m_hookInfo.wMenuItemID = LOWORD(pMSG->wParam);
      m_hookInfo.hMenu = (HMENU)pMSG->lParam;
      break;
   case WM_LBUTTONUP:
      {
         switch(m_hookInfo.wMenuItemID)
         {
         case ID_VIEW_TOOLBAR:
         case ID_VIEW_STATUS_BAR:
            // cases for other menu command IDs...
            {
               // toggle check item
               MENUITEMINFO menuItemInfo = {0};
               menuItemInfo.cbSize = sizeof(MENUITEMINFO);
               menuItemInfo.fMask = MIIM_STATE;
               ::GetMenuItemInfo(m_hookInfo.hMenu, m_hookInfo.wMenuItemID, FALSE, &menuItemInfo);
               if(MFS_CHECKED & menuItemInfo.fState) 
                  menuItemInfo.fState &= ~MFS_CHECKED;
               else
                  menuItemInfo.fState |= MFS_CHECKED;
               ::SetMenuItemInfo(m_hookInfo.hMenu, m_hookInfo.wMenuItemID, FALSE, &menuItemInfo);

               // send command message to main window
               CWnd* pWnd = AfxGetMainWnd();
               ASSERT_VALID(pWnd);
               pWnd->SendMessage(WM_COMMAND, MAKEWPARAM( m_hookInfo.wMenuItemID, 0), 0);  

               // change to WM_NULL to prevent closing menu
               pMSG->message = WM_NULL;
            }
         }
      }
      break;
   case WM_LBUTTONDBLCLK:
      // just set WM_NULL to get rid of all default processing 
      pMSG->message = WM_NULL;
      break;
    }
}
Cred ca liniile de cod vorbeste. :) insa daca sunt nelamuriri, va rog intrebati.
Bineiteles, totul se poate face mai frumos si mai gospodareste, scotand chestiile batute-n cuie si facand o clasa separata pentru toata dandanaua. Asta-i doar un exemplu care sa demonstreze smekeria. ;)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: check-uirea mai multor butoane intr-un menubar

Post by Ovidiu Cucu » 05 Oct 2012, 08:28

Pai, se inchide pentru celelalte eveniente "standard" care inchid un meniu: userul da click in afara, muta cursorul pe un alt menu, etc. La fel si cand da click pe un item al carui ID nu-i "filtrat". Bineiteles, daca e nevoie se poate schimba modificand codul de mai sus.

[ off-topic ]
@Laurentiu, nu toata lumea face doar business-logic in spatele unor componente custom cumparate. De exemplu, "producatorii de componente GUI". ;)
The rest is just marketing, din care din pacate din ce in ce mai multi manageri iau supradoze.
Am zis de la inceput ca e bine sa lase comportamentul default al meniului si sa gaseasca solutii alternative. Insa cine stie, poate cineva chiar are nevoie de asa ceva... asa ca am incercat sa gasesc o solutie de programator Windows si nu de manager care arunca cu parale pentru orice chichitza, mai putin pe salarii de programatori.

tudor_t
Membru
Membru
Posts: 112
Joined: 26 Aug 2007, 15:11

Re: check-uirea mai multor butoane intr-un menubar

Post by tudor_t » 05 Oct 2012, 11:10

E doar o chestie de costuri - daca in acel proiect clientul plateste 50€/ora/programator, poate e mai ieftin sa cumpere componenta din alta parte si programatrul sa se concentreze pe aplicatia proprie.. :)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: check-uirea mai multor butoane intr-un menubar

Post by Ovidiu Cucu » 06 Oct 2012, 08:40

[ off-topic ]
tudor_t wrote:E doar o chestie de costuri - daca in acel proiect clientul plateste 50€/ora/programator, poate e mai ieftin sa cumpere componenta din alta parte...
Sigur, sa zicem ca un client plateste 50€/ora/programator (salariu plus apa/gaz/electricitate, hartie igienica, cafea moca, alte cheltuieli si in fine un mic profit). Socotind si tragand linie rezulta, sa zicem, un necesar de 50 de programatori pentru timpul in care proiectul trebuie finalizat. Clientul plateste.
Practic insa, proiectul e luat in spate de 5-10 programatori (ceilalti, daca exista sunt doar goagle searchers), nici pe departe platiti cu 50€/ora. Diferenta intra in buzunarul unor baieti destepti, care nu degeaba "are pravalie in centru". :)

[ later edit ]
Sa nu ne mai miram ca, dupa ce o firma "cu pravalie in centru" papa miloane de euroi (sa zicem de la UE) ca sa implementeze un proiect, mai cere inca un milion (tot de la UE) ca sa subcontracteze proiectul unei firme care contine totusi si programatori, ca sa-l scoata din cacat. ;)
tudor_t wrote:... si programatrul sa se concentreze pe aplicatia proprie.. :)
Adica sa "scrie cod" (aka business logic).
Nu mai bine o punem sa se concentreze pe tanti secretara, in timpul liber? Si nu mai avem nevoie sa aruncam parale pe nici un programator. :D

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: check-uirea mai multor butoane intr-un menubar

Post by neagu_laurentiu » 06 Oct 2012, 10:01

Ovidiu ai cam avut experiente nefericite cu managerii :)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: check-uirea mai multor butoane intr-un menubar

Post by Ovidiu Cucu » 06 Oct 2012, 10:26

[ off-topic ]
neagu_laurentiu wrote:Ovidiu ai cam avut experiente nefericite cu managerii :)
Nu, Laurentiu, "manager" sunt si eu. A fost doar o reactie la raspunsul "Vezi meniurile custom de la producatorii de componente GUI" pentru o nenoricita de problema pe care un programator bun poate s-o rezolve in doi timpi si trei miscari. ;)

User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Re: check-uirea mai multor butoane intr-un menubar

Post by black_atus » 09 Oct 2012, 08:09

Va multumesc mult pentru sfaturi !!!

Ma gandeam la o metoda total neortodoxa: cand dau click pe un item din popup sa fac din nou focus pe el pentru a deschide inca o data popupul...asta ar fi fost solutia mea, foarte proasta in comparatie cu cele de aici.

In legatura cu cumpararea unor bucati de cod nu sunt inca atat de stabil material incat sa fac asta pentru moftul catorva clienti carora le e lene sa dea cateva click-uri in plus. Oricum acolo era un buton de customize care deschidea o fereastra de unde se putea face selectarea / deselectarea mai multor toolbaruri.

O sa incerc metoda lui Ovidiu.

Va multumesc inca o data. :whorship:
Cu stima,
Daniel Constantin

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: check-uirea mai multor butoane intr-un menubar

Post by neagu_laurentiu » 09 Oct 2012, 09:31

Povestea mea cu achizitia unor componente nu era strict la un meniu, desi in contextul dat asa a reiesit. Intr-o aplicatie ai nevoie de multe alte controale (grid, tree multicoloana, combo-uri custom, generator rapoarte, layout manager s.a.m.d.) ce nu-s in MFC si care sunt necesare. Ori din perspectiva asta eu am venit cu solutia.

Post Reply