Приветствую всех. Народ, пожалуйста, помогите побороть TRIVERTEX, а то он меня уже одолел :-\ Речь о API GradientFill. В двух разных языках пробовал - работает, на asm'e никак не могу передать в ф-цию параметры. Нужно передать массив из двух элементов, каждый из которых - структуры TRIVERTEX Код (Text): typedef struct _TRIVERTEX { LONG x; Long y; COLOR16 Red; COLOR16 Green; COLOR16 Blue; COLOR16 Alpha; }TRIVERTEX, *PTRIVERTEX; элемент типа GRADIENT_RECT Код (Text): typedef struct _GRADIENT_RECT { ULONG UpperLeft; ULONG LowerRight; }GRADIENT_RECT, *PGRADIENT_RECT; В MSDN есть пример на Си: Код (Text): 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, подскажите, как это делается.
Из опыта работы с другими структурами могу сказать, заполняй сначала 0. Затем в С-шных структурах умалчивается выравнивание, например: Код (Text): PARTITION_INFORMATION_MBR struct PartitionType UCHAR ? BootIndicator BOOLEAN ? RecognizedPartition BOOLEAN ? align 2 HiddenSectors ULONG ? PARTITION_INFORMATION_MBR ends Фишка была как раз в align 2 без этого не работало )
Есть вариант такой Код (Text): 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) и сразу все встанет на свои места
SteelRat Да, я сразу и смотрел SIZEOF = 16. С использованием структуры пока не сделал, сделал таким вот странным способом (но работает) Код (Text): 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 Или если на стеке хранить, то всё к верху ногами разворачивать: Код (Text): 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'ов. Осталось со структурами разобраться.
Со структурой тоже разобрался: надо было учесть, что в стеке адреса идут вниз, и передавать адрес не первого а второго элемента массива. Т.е. если располагать переменную в секции .data, то offset TV1 == offset TV0 + 16, а если на стеке offset TV1 == offset TV0 - 16. Ну вроде всё.