21. august 2006 - 16:32Der 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).
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?
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);
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
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);
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.
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.
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.
Synes godt om
Ny brugerNybegynder
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.