| |
|
|
| Meine Frage an Andreas Miethe, was richtigerweise bei funzt stehen könnte, um das Malen aller einzelnen Einträge der ListBox damit selbst zu übernehmen, dass ein hPic gezeichnet wird statt z.B. der Eintragstext. KompilierenMarkierenSeparierencls
var h&=create(ListBox,hWnd,0,10,10,200,200)
var hPic&=create(hNewPic,15,15,$1278FF)
subClass h&,1
addString(h&,Hallo Welt)
addString(h&,Hallo Welt2)
while 1
waitInput
wend
end
subClassProc
if &sWnd=h&
funzt
drawPic hPic
endif
endProc
|
|
|
| |
|
|
|
Andreas Miethe
| Hallo @IF
Habe noch ein kleines Problem beim Starten per Interpreter, mal ne kleine Pause machen, meistens hilft das. KompilierenMarkierenSeparierenHeader-Dateien
$H windows.ph
$H messages.ph
Strukturen
Struct RECT = Left&,Top&,Right&,Bottom&
Struct DRAWITEMSTRUCT = CtlType&,CtlID&,itemID&,itemAction&,itemState&,hwndItem&,hDC&,rcItem!RECT,itemData&
Declare lpdis#,Rect#,h&
Dim lpdis#,DRAWITEMSTRUCT
Dim Rect#,RECT
var hPic&=create(hNewPic,15,15,$1278FF)
cls ~GetSysColor(~COLOR_BTNFACE)
subClass %hwnd,1
h& = Control(LISTBOX,,~WS_BORDER | ~WS_CHILD | ~WS_VISIBLE | ~LBS_OWNERDRAWFIXED | ~LBS_HASSTRINGS | ~LBS_STANDARD ,10,10,200,200,%hwnd,0,%hInstance,0)
SendMessage(h&, ~LB_SETITEMHEIGHT,0,Makelong(18,0))
Var Item& = AddString(h&,Hallo Welt)
SendMessage(h&,~LB_SETITEMDATA,Item&,hPic&)
Item& = AddString(h&,Hallo Welt 2)
SendMessage(h&,~LB_SETITEMDATA,Item&,hPic&)
AddString(h&,Hallo Welt 3)
Warum geht es mit dem Interpreter erst, wenn ich in die Listbox klicke ?
Als Kompilat funktioniert es !
Habe ich heute ein Brett vorm Kopf ?
Var Ende& = 0
Whilenot Ende&
WaitInput
EndWhile
end
SubClassProc
If SubClassMessage(%hwnd,~WM_DRAWITEM)
lpdis# = &slParam
Var Text$ = GetString$(lpdis#.hwndItem&,lpdis#.itemID&)
Var hbmpPicture& = SendMessage(lpdis#.hwndItem&,~LB_GETITEMDATA, lpdis#.itemID&,0)
Var hdcMem& = ~CreateCompatibleDC(lpdis#.hdc&)
Var hbmpOld& = ~SelectObject(hdcMem&, hbmpPicture&)
lpdis#.rcItem!left&= lpdis#.rcItem!left& + 20
Rect#.Left& = lpdis#.rcItem!left&
Rect#.Top& = lpdis#.rcItem!Top&
Rect#.Right& = lpdis#.rcItem!Right&
Rect#.Bottom& = lpdis#.rcItem!Bottom&
~DrawText(lpdis#.hdc&, Addr(Text$), Len(Text$), Rect#,0)
~BitBlt(lpdis#.hdc&, lpdis#.rcItem!left&-20, lpdis#.rcItem!top&, lpdis#.rcItem!right& - lpdis#.rcItem!left&,lpdis#.rcItem!bottom& - lpdis#.rcItem!top&, hdcMem&, 0, 0, ~SRCCOPY)
~SelectObject(hdcMem&, hbmpOld&)
~DeleteDC(hdcMem&)
Set(WinProc, 1)
EndIf
EndProc
|
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 21.02.2009 ▲ |
|
|
|
|
| Wow dankesehr schonmal - so sehe ich auf jeden Fall wie es gedacht ist.
Falls ich etwas zum Interpreter herausfind... |
|
|
| |
|
|
|
Jörg Sellmeyer | |
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 21.02.2009 ▲ |
|
|
|
|
Andreas Miethe
| Jörg Sellmeyer
Hallo Jörg,
das scheint an der direkten Übergabe der Rechteckstruktur in der Drawitem-Struktur zu liegen. HH hatte auch das Problem bei Ownerdraw-Menüs. Warum das bei mir klappt und bei andern nicht ? Keine Ahnung. Habe den Code dahingehend abgeändert, sollte jetzt funktionieren. |
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 22.02.2009 ▲ |
|
|
|
|
Jörg Sellmeyer | Ich hatte noch nicht 11.1 drauf! Steoll doch nochmal den originalen Code rein - vielleicht lag es daran. @Horst - welche Version hast Du? |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 22.02.2009 ▲ |
|
|
|
|
Andreas Miethe
| Hallo Jörg,
hier nochmal das Original. KompilierenMarkierenSeparierenHeader-Dateien
$H windows.ph
$H messages.ph
Strukturen
Struct RECT = Left&,Top&,Right&,Bottom&
Struct DRAWITEMSTRUCT = CtlType&,CtlID&,itemID&,itemAction&,itemState&,hwndItem&,hDC&,rcItem!RECT,itemData&
Declare lpdis#,Rect#,h&,WP#
Dim lpdis#,DRAWITEMSTRUCT
var hPic&=create(hNewPic,15,15,$1278FF)
cls ~GetSysColor(~COLOR_BTNFACE)
subClass %hwnd,1
h& = Control(LISTBOX,,~WS_BORDER | ~WS_CHILD | ~WS_VISIBLE | ~LBS_OWNERDRAWFIXED | ~LBS_HASSTRINGS | ~LBS_STANDARD | ~LBS_NOTIFY,10,10,200,200,%hwnd,0,%hInstance,0)
SendMessage(h&, ~LB_SETITEMHEIGHT,0,Makelong(18,0))
Var Item& = AddString(h&,Hallo Welt)
SendMessage(h&,~LB_SETITEMDATA,Item&,hPic&)
Item& = AddString(h&,Hallo Welt 2)
SendMessage(h&,~LB_SETITEMDATA,Item&,hPic&)
AddString(h&,Hallo Welt 3)
Warum geht es mit dem Interpreter erst, wenn ich in die Listbox klicke ?
Als Kompilat funktioniert es !
Habe ich heute ein Brett vorm Kopf ?
Var Ende& = 0
Whilenot Ende&
WaitInput
EndWhile
end
SubClassProc
If SubClassMessage(%hwnd,~WM_DRAWITEM)
lpdis# = &slParam
Var Text$ = GetString$(lpdis#.hwndItem&,lpdis#.itemID&)
Var hbmpPicture& = SendMessage(lpdis#.hwndItem&,~LB_GETITEMDATA, lpdis#.itemID&,0)
Var hdcMem& = ~CreateCompatibleDC(lpdis#.hdc&)
Var hbmpOld& = ~SelectObject(hdcMem&, hbmpPicture&)
lpdis#.rcItem!left&= lpdis#.rcItem!left& + 20
~DrawText(lpdis#.hdc&, Addr(Text$), Len(Text$), lpdis#.rcItem,0)
~BitBlt(lpdis#.hdc&, lpdis#.rcItem!left&-20, lpdis#.rcItem!top&, lpdis#.rcItem!right& - lpdis#.rcItem!left&,lpdis#.rcItem!bottom& - lpdis#.rcItem!top&, hdcMem&, 0, 0, ~SRCCOPY)
~SelectObject(hdcMem&, hbmpOld&)
~DeleteDC(hdcMem&)
Set(WinProc, 1)
EndIf
EndProc
|
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 22.02.2009 ▲ |
|
|
|
|
Jörg Sellmeyer | Mh - seltsam. Im Interpreter knallts nicht, in compilierter Form schon. Allerdings zeigt bei mir die Runtime immer noch 11.0 an und der Interpreter 11.1, obwohl ich alle Dateien aus dem letzten(?) Update vom 2.12. drauf habe. |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 22.02.2009 ▲ |
|
|
|
|
Andreas Miethe
| Dann ist was schiefgelaufen bei Deinem Update. Meine Runtime zeigt korrekt 11.1 an.
Dateidatum Runtime, Interpreter und Compiler 26.11.2008 11:01 |
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 22.02.2009 ▲ |
|
|
|
|
Jörg Sellmeyer | Ok - jetzt hab ichs auch. Hatte vergessen in den Projekteinstellungen die neue Runtime anzugeben. Läuft also bis auf die Interpreter-/Runtime-Seltsamigkeit, die Du oben erwähnt hast. |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 22.02.2009 ▲ |
|
|
|
|
| Das Beispiel zeigt, dass es schade ist, dass die SubClassProc nur im WaitInput greift.
Werden im Programmablauf zunächst die Listboxen erzeugt und befüllt, wonach dann die Hauptschleife mit WaitInput erreicht wird.
Weil die Nachrichten verloren sind, werden zunächst keine Items dargestellt. |
|
|
| |
|
|
|
| Hmpf, auch wenn ich z.B. wm_drawItem zusätzlich als UserMessage deklariere um der Hauptschleife mitzuteilen, dass in ListBoxen Einträge zu zeichnen wären, dann erhalte ich (natürlich) weder in uwnd, ulparam noch uwparam eine brauchbare Info - sodass ich neu zeichnen könnte.
Könnte man _nur innerhalb der subClassProc und innerhalb des waitInput addString anweisen sodass die Einträge auch angezeigt werden. :/
Ich teste mal, ob man wm_command als UserMessage nutzen kann - sollte ja bei lbs_notfiy versandt werden mit Handle der ListBox im ulParam.
Nachtrag: wm_command wird nicht ausgelöst von addString - ldr. (auch) keine Lösung. |
|
|
| |
|
|