|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 18, 2004 15:26:47 Приветствую всех. Народ, пожалуйста, помогите побороть TRIVERTEX, а то он меня уже одолел :-\ Речь о API GradientFill. В двух разных языках пробовал - работает, на asm'e никак не могу передать в ф-цию параметры. Нужно передать массив из двух элементов, каждый из которых - структуры TRIVERTEX typedef struct _TRIVERTEX {
LONG x;
Long y;
COLOR16 Red;
COLOR16 Green;
COLOR16 Blue;
COLOR16 Alpha;
}TRIVERTEX, *PTRIVERTEX;
элемент типа GRADIENT_RECT typedef struct _GRADIENT_RECT {
ULONG UpperLeft;
ULONG LowerRight;
}GRADIENT_RECT, *PGRADIENT_RECT;
В MSDN есть пример на Си: TRIVERTEX vert[2] ; GRADIENT_RECT gRect; vert [0] .x = 0; vert [0] .y = 0; vert [0] .Red = 0x0000; vert [0] .Green = 0x0000; vert [0] .Blue = 0x0000; vert [0] .Alpha = 0x0000; vert [1] .x = 100; vert [1] .y = 32; vert [1] .Red = 0x0000; vert [1] .Green = 0x0000; vert [1] .Blue = 0xff00; vert [1] .Alpha = 0x0000; gRect.UpperLeft = 0; gRect.LowerRight = 1; GradientFill(hdc,vert,2,&gRect,1,GRADIENT_FILL_RECT_H); который "To draw a shaded rectangle from [0,0] to [100,32]". В asm'e никак не хочет работать - просто черное окно и всё. Пробовал делать и с assume edi: и просто подряд две переменные типа TRIVERTEX, в надежде, что они будут восприняты как два элемента массива, и ещё как-то (даже и не вспомню, всё что пробовал). В Инете ни единой строки асмовой на эту тему не нашёл. Может, кто работал с GradientFill, подскажите, как это делается. |
|
|
Дата: Окт 18, 2004 16:18:57 Из опыта работы с другими структурами могу сказать, заполняй сначала 0. Затем в С-шных структурах умалчивается выравнивание, например: PARTITION_INFORMATION_MBR struct PartitionType UCHAR ? BootIndicator BOOLEAN ? RecognizedPartition BOOLEAN ? align 2 HiddenSectors ULONG ? PARTITION_INFORMATION_MBR ends Фишка была как раз в align 2 без этого не работало ;)) |
|
|
Дата: Окт 18, 2004 17:49:33 Align ставил перед структурой, но чтобы внутри - не пробовал. Счас попробую. |
|
|
Дата: Окт 18, 2004 18:14:28 Есть вариант такой
TRIVERTEX struct
x :LONG ?
y :Long ?
Red :COLOR16 ?
align 2
Green :COLOR16 ?
align 2
Blue :COLOR16 ?
align 2
Alpha :COLOR16 ?
TRIVERTEX ends
т.к. COLOR16 - размером в WORD попробуй вывести значение sizeof(TRIVERTEX) и сразу все встанет на свои места :) |
|
|
Дата: Окт 18, 2004 19:16:40 SteelRat Да, я сразу и смотрел SIZEOF = 16. С использованием структуры пока не сделал, сделал таким вот странным способом (но работает:)) TrivertexProc proc LOCAL GradRect :GRADIENT_RECT LOCAL hDC :DWORD .data tv_x0 dd 1 tv_y0 dd 90 tv_red0 dw 0f000h tv_green0 dw 0f000h tv_blue0 dw 00000h tv_alpha0 dw 0 tv_x1 dd 599 tv_y1 dd 300 tv_red1 dw 0 tv_green1 dw 0ff00h tv_blue1 dw 0ff00h tv_alpha1 dw 0 .code mov tv_red0, 0ff00h mov tv_green0, 0ff00h mov tv_blue0, 0ff00h mov GradRect.UpperLeft,0 mov GradRect.LowerRight,1 invoke GetWindowDC,hWnd mov hDC, eax invoke GradientFill,hDC,ADDR tv_x0,2,ADDR GradRect,1,1 invoke ReleaseDC,hWnd,hDC ret TrivertexProc endp Или если на стеке хранить, то всё к верху ногами разворачивать: TrivertexProc proc LOCAL TV1_alpha :WORD LOCAL TV1_blue :WORD LOCAL TV1_green :WORD LOCAL TV1_red :WORD LOCAL TV1_y :DWORD LOCAL TV1_x :DWORD LOCAL TV0_alpha :WORD LOCAL TV0_blue :WORD LOCAL TV0_green :WORD LOCAL TV0_red :WORD LOCAL TV0_y :DWORD LOCAL TV0_x :DWORD LOCAL GradRect :GRADIENT_RECT LOCAL hDC :DWORD mov TV0_x, 1 mov TV0_y, 90 mov TV0_red, 0f000h mov TV0_green, 0f000h mov TV0_blue, 00000h mov TV0_alpha, 0 mov TV1_x, 599 mov TV1_y, 300 mov TV1_red, 00000h mov TV1_green, 0ff00h mov TV1_blue, 0ff000h mov TV1_alpha, 0 mov GradRect.UpperLeft,0 mov GradRect.LowerRight,1 invoke GetWindowDC,hWnd mov hDC, eax invoke GradientFill,hDC,ADDR TV0_x,2,ADDR GradRect,1,1 invoke ReleaseDC,hWnd,hDC ret TrivertexProc endp Причём без align'ов. Осталось со структурами разобраться. |
|
|
Дата: Окт 18, 2004 19:57:42 Со структурой тоже разобрался: надо было учесть, что в стеке адреса идут вниз, и передавать адрес не первого а второго элемента массива. Т.е. если располагать переменную в секции .data, то offset TV1 == offset TV0 + 16, а если на стеке offset TV1 == offset TV0 - 16. Ну вроде всё. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.053 |