Avatar billede killer_bee Nybegynder
21. august 2006 - 16:32 Der er 10 kommentarer og
1 løsning

CImageList 'plukke' to 16*16 images til en 32*16

Hej alle,

Her er en meget irriterende problem jeg har stødt på.
Jeg har en bitmap som har X antal af 16*16 iconer i sig. Jeg skal bruge en måde at dynamisk plukke dem og vise dem i en CListCtrl.
Altså hvis jeg skal vise icon 1 og 5 fra min originale bitmap skal den nye image være 32*16 lang som indeholder de to billeder.

forestil jer at det her er en bitmap
0 1 2 3 4 5 6 ... N
------------------------
A B C D E F G ...

altså jeg har bogstaver på det givne position. Når jeg skal vise det skal jeg ud fra nogle flag finde ud af hvilke bogstaver jeg skal vise. Så for ikke at lave alle tænkelige permutationer af kombinationerne af de to bogstaver jeg kan have brug for, vil jeg gerne have en dynamisk metode til at plukke dem og vise dem i 1 colone i CListCtrl.

Det er lidt svært at forklare tror jeg men bare kom med spørgsmål så prøver jeg at uddybe.

har sat den til 150 point, men hvis man vil have flere kan vi snakke om det da jeg syns selv at den er svær(og irriterende).

På forhånd tak.
Avatar billede bertelbrander Novice
21. august 2006 - 19:40 #1
Det burde ikke være det store problem, men din CListCtrl skal laves som en "owner-drawn", dvs du skal selv håndtere CListCtrl::DrawItem, så du skal sætte LVS_OWNERDRAWFIXED når du opretter den.

Jeg kan godt forsøge at lave et eksempel, er det Microsoft VisualC++ 6.0?
Avatar billede bertelbrander Novice
21. august 2006 - 23:41 #2
Jeg har lagt et lille VC++ 6.0 project her:
http://damb.dk/zip/clistctrl.zip
Avatar billede killer_bee Nybegynder
22. august 2006 - 10:18 #3
bertelbrander: det er lige det jeg har brug for, men det kode du har lavet har jeg lidt svært at finde rundt i. Min listCtrl klasse ser ca sadan ud:
void CTestListCtrl::Init()
{
    //---------------------------------------------------------------------------------
    //    LVS_EX_HEADERDRAGDROP enables users to move around the collumns in the listCtrl
    //---------------------------------------------------------------------------------
    SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES | LVS_EX_HEADERDRAGDROP | LVS_EX_INFOTIP);
       
    ImageList.Create(IDB_BITMAP1,16,1,RGB(255,255,255));

    //--------------------------------------------
    // Building the list control box
    //--------------------------------------------
    int ColumnIndex = 0;

    InsertColumn(ColumnIndex++, "Col1", LVCFMT_LEFT, 100, 0);
    InsertColumn(ColumnIndex++, "Col2", LVCFMT_LEFT, 100, 0);
    InsertColumn(ColumnIndex++, "Col3", LVCFMT_LEFT, 100, 0);
}

void CTestListCtrl::FillList(CObListEx &List)
{
    POSITION Pos = List.GetHeadPosition();
    while (Pos) {
        // get object
        // Call Insert
    }
}

void CTestListCtrl::Insert()
{
    // int Index = GetItemCount();
    //    InsertItem(Index, text);
    //  HERE I need to be able to do the following:
    //    for (number of object flags){
    //        if (flag is set) {
    //            add image;
    //        }
    //    }
    // ALL done - SetImage

   
}

void CTestListCtrl::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO: Add your message handler code here and/or call default
   
    CListCtrl::OnDrawItem(nIDCtl, lpDrawItemStruct);
}


Jeg har tilføjet OnDrawItem men er ikke helt sikke på hvordan koden skal se ud så den er generisk.

Gider du modificere så smider jeg 50 point oveni... syns virkelig nice lavet tak på forhånd
Avatar billede killer_bee Nybegynder
22. august 2006 - 14:02 #4
altså min insert skal inserte N antal af rows med X antal koloner og i midten et eller andet sted, lad os sige colone 3 skal jeg have de images:
void CTestListCtrl::Insert()
{
    // int ColumnIndex = 1;
    // int Index = GetItemCount();
    //  InsertItem(Index, text);
    //  SetItemText(Index,ColumnIndex++, textCol_2);
    //  HERE I need to be able to do the following:
    //    for (number of object flags){
    //        if (flag is set) {
    //            add image;
    //        }
    //    }
    //  Set the combined IMAGE(Index,ColumnIndex++, CombinedImageCol_3);
    //  SetItemText(Index,ColumnIndex++, textCol_4);
    //  SetItemText(Index,ColumnIndex++, textCol_5);
    //  SetItemText(Index,ColumnIndex++, textCol_6);
...
..
.
    //  SetItemText(Index,ColumnIndex++, textCol_N);

}
Avatar billede bertelbrander Novice
22. august 2006 - 19:35 #5
Jeg forstår ikke hvad det er du vil have mig til.

clistctrlDlg.cpp i mit eksempel indeholder koden for at tegne list-control'en, den ligner meget din.

Det burde være lige til at låne min kode og putte den ind i din.
Avatar billede killer_bee Nybegynder
23. august 2006 - 09:33 #6
jo men det jeg ikke lige kan se er hvordan jeg får det ind i min 'Insert' function som er struktureret som beskrevet ovenfor. Kan ikke helt se hvordan jeg angiver hvilken kolone imagen skal være i. har prøvet at sætte LvItem.iSubItem = 2; i din OnDraw, men det virker ikke som jeg forventede , der kommer ikke images i kolone 3 ... og har selvfølgeligt insertet de extra koloner :
    listCtrl->InsertColumn(0, "First", LVCFMT_LEFT, 100);
    listCtrl->InsertColumn(1, "Second", LVCFMT_LEFT, 100);
    listCtrl->InsertColumn(2, "Third", LVCFMT_LEFT, 100);
    listCtrl->InsertColumn(3, "Fourth", LVCFMT_LEFT, 100);

Har bare ikke lige helt gennemskuet hvordan du gør det ...

Det er fordi jeg har struktureret min listctrl med en init som inserter koloner og en insert som smider items i. og det er i inserten jeg ikke helt kan gennemskue hvordan jeg skal skrive din kode om.
Tak for hjælpen på forhånd.
Avatar billede bertelbrander Novice
23. august 2006 - 20:49 #7
Jeg har lavet en ny version:
http://damb.dk/zip/clistctrl2.zip

Den tegner billedet i 3. kolonne.
Avatar billede killer_bee Nybegynder
25. august 2006 - 20:53 #8
bertelbrander - MANGE tak ... det er lige det jeg ikke kunne gennemskue.
Jeg ved godt at du plejer at skrive at du ikke samler på point, men jeg vil meget gerne give dig disse point da du hjalp mig rigtig meget. Så smid et svar så kan jeg lukke spørgsmålet.
Tak en gang til.
Avatar billede killer_bee Nybegynder
29. august 2006 - 18:35 #9
bertelbrander - smider du ikke lige et svar??
Avatar billede bertelbrander Novice
29. august 2006 - 22:55 #10
Jeg samler ikke på point
Avatar billede killer_bee Nybegynder
30. august 2006 - 13:13 #11
Ja men så må jeg tage dem igen, men tak for hjælpen. Hvis du nu skulle bruge nogle point er du velkommen til at skrive noget så får du dem.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester