Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 4

Автор: Yozj
Дата сообщения: 01.12.2008 10:29
shadow user777
Можно конечно, садишься, открываешь проект в С++Builder, содаешь проект той же структуры в Delphi и по строчечкам аккуратно переводишь с С++ на Delphi
Или ты рассчитываешь, что существует универсальный автоконвертатор из Си в Delphi?

Добавлено:
yegorovpavel
Смотри события:
OnClickAxis
OnClickBackground
OnCLickLegend
OnClickSeries

Каждый обрабатывает свой клик, но все имеют координаты X, Y - координаты отображения.
Чтобы перевести в координаты нужного графика смотри хелп по функциям:
XScreenToValue
YScreenToValue
и им подобные.

Например, я на OnClickBackground получаю координаты в терминах графика следующим образом:

Код:
Sender.Title.Text.Add('Series 0 X: '+FloatToStr(Sender.Series[0].XScreenToValue(X)) + ', Y: '+FloatToStr(Sender.Series[0].YScreenToValue(Y)));
Автор: Maks150988
Дата сообщения: 01.12.2008 12:43
ShIvADeSt
Блин, немного непонятные некоторые ньюансы у Вашего кода. Допустим TRUE или FALSE принимает. Но надо понимать OverOK у Вас в WM_MOUSEMOVE TRUE принимает, а NotOver - FALSE? Я не гуру, нам бы простым любителям-программистам что-нибудь попроще.
И еще у Вас код if (DStr.itemState and ODS_FOCUS)<>0 then Focused:=True else Focused:=False;
Используется переменная Focused для DrawButton*. Вот тут я не знаю к чему мне результаты этого Focused, а ведь (DStr.itemState and ODS_FOCUS)<>0 поди тут тоже важно.

Изменил на такой код, немного переработав:
[more=Далее...]program hButton;

{$R hButton.res}

uses
Windows, Messages;

const
RES_DIALOG = 101;
RC_BUTTON = 101;

var
hApp : Integer;
OldBtnProc : Pointer;
hBtnTrack : Boolean;
TrackMouse : TTRACKMOUSEEVENT;
PS : PAINTSTRUCT;
Rect : TRect;
NewBmp : HBITMAP;
OldBmp : HBITMAP;
CompDC : HDC;
// bRegion : HRGN;

procedure PaintImageFileButton(DC : HDC; RtBtn : TRect; szPathFile : WideString);
begin
CompDC := CreateCompatibleDC(0);
NewBmp := LoadImageW(hInstance, PWideChar(szPathFile), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE);
OldBmp := SelectObject(CompDC, NewBmp);
BitBlt(PS.hDC, 0, 0, RtBtn.Right - RtBtn.Left, RtBtn.Bottom - RtBtn.Top, CompDC, 0, 0, SRCCOPY);
SelectObject(CompDC, OldBmp);
DeleteDC(CompDC);
DeleteObject(NewBmp);
end;

function DrawCloseButton(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
bRect : TRect;
begin
case uMsg of

WM_MOUSEMOVE:
begin
if not hBtnTrack then
begin
TrackMouse.cbSize := SizeOf(TrackMouse);
TrackMouse.hwndTrack := hWnd;
TrackMouse.dwFlags := TME_LEAVE;
TrackMouse.dwHoverTime := HOVER_DEFAULT;
hBtnTrack := TrackMouseEvent(TrackMouse);
InvalidateRect(hWnd, nil, TRUE);
end;
end;

WM_MOUSELEAVE:
begin
TrackMouse.cbSize := SizeOf(TrackMouse);
TrackMouse.hwndTrack := hWnd;
TrackMouse.dwFlags := TME_HOVER;
TrackMouse.dwHoverTime := HOVER_DEFAULT;
TrackMouseEvent(TrackMouse);
hBtnTrack := FALSE;
InvalidateRect(hWnd, nil, TRUE);
end;

WM_PAINT:
begin
GetClientRect(hWnd, bRect);
BeginPaint(hWnd, PS);
case hBtnTrack of
TRUE:
PaintImageFileButton(PS.hDC, bRect, 'CloseButtonOver.bmp');
FALSE:
PaintImageFileButton(PS.hDC, bRect, 'CloseButtonNormal.bmp');
end;
EndPaint(hWnd, PS);
end;

end;
Result := CallWindowProcW(OldBtnProc, hWnd, uMsg, wParam, lParam);
end;

procedure Button_OnDrawItemW(lpdis: PDRAWITEMSTRUCT);
//var
//Focused: Boolean;
begin
//if (lpdis.itemState and ODS_FOCUS)<>0 then Focused:=True else Focused:=False;
// if (lpdis.itemState and ODS_SELECTED) <> 0 then
// PaintImageFileButton(lpdis.hdc, lpdis.rcItem, 'CloseButtonDown.bmp')
// else
// PaintImageFileButton(lpdis.hdc, lpdis.rcItem, 'CloseButtonNormal.bmp');
// if hBtnTrack and not ((lpdis.itemState and ODS_SELECTED) <> 0) then
// PaintImageFileButton(lpdis.hdc, lpdis.rcItem, 'CloseButtonOver.bmp');
// PaintImageFileButton(lpdis.hdc, lpdis.rcItem, 'CloseButtonDown.bmp');



{ курсор перемещаем над кнопкой с зажатой левой кнопкой мыши }
if hBtnTrack and ((lpdis.itemState and ODS_SELECTED) <> 0) and ((lpdis.itemState and ODS_FOCUS) <> 0) then
PaintImageFileButton(lpdis.hdc, lpdis.rcItem, 'CloseButtonDown.bmp')
else


{ обычное состояние кнопки }
PaintImageFileButton(lpdis.hdc, lpdis.rcItem, 'CloseButtonNormal.bmp');

ReleaseDC(lpdis.hwndItem, lpdis.hdc);
end;

function MainWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM) : BOOL; stdcall;
begin
Result := TRUE;
case uMsg of

WM_INITDIALOG:
begin
hApp := hWnd;
SetWindowLongW(hApp, GWL_EXSTYLE, GetWindowLong(hApp, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(hApp, $00FF00FF, 255, LWA_COLORKEY + LWA_ALPHA);
OldBtnProc := Pointer(GetWindowLongW(GetDlgItem(hApp, RC_BUTTON), GWL_WNDPROC));
SetWindowLongW(GetDlgItem(hApp, RC_BUTTON), GWL_WNDPROC, LongInt(@DrawCloseButton));
// GetWindowRect(GetDlgItem(hApp, RC_BUTTON), Rect);
// bRegion := CreateRoundRectRgn(0, 0, Rect.Right - Rect.Left - 3, Rect.Bottom - Rect.Top - 3, 8, 8);
// CombineRgn(bRegion, bRegion, bRegion, RGN_COPY);
// SetWindowRgn(GetDlgItem(hApp, RC_BUTTON), bRegion, TRUE);
end;

WM_PAINT:
begin
GetClientRect(hApp, Rect);
BeginPaint(hApp, PS);
PaintImageFileButton(PS.hDC, Rect, 'MainWindow.bmp');
EndPaint(hApp, PS);
end;


WM_DRAWITEM:
begin
case LoWord(wParam) of
RC_BUTTON:
Button_OnDrawItemW(PDRAWITEMSTRUCT(lParam));
end;
Result := FALSE;
end;

WM_LBUTTONDOWN:
SendMessageW(hApp, WM_NCLBUTTONDOWN, HTCAPTION, lParam);

WM_COMMAND:
begin
case LoWord(wParam) of
RC_BUTTON:
SendMessageW(hApp, WM_CLOSE, 0, 0);
end;
end;

WM_CLOSE, WM_DESTROY:
PostQuitMessage(0);

else
Result := FALSE;
end;
end;

begin
DialogBoxW(hInstance, PWideChar(RES_DIALOG), 0, @MainWndProc);
end.

[/more]

Но... пока непонятно, как сделать такой эффект: Курсор навели на кнопку, подождали, нажали кнопку, должна измениться картинка у кнопки с наведенной на нажатую. Сделал вроде как через ODS_FOCUS проверку, но не выходит ничего. Хм, непонятен этот момент.
И все-таки хочется чтобы Вы скачали проект по ссылке и посмотрели. А то все слова слова, а тут на деле сразу. И вот хотел узнать, Вы определяетев обоработчике еще и тип контрола через ODT_BUTTON. Я вроде как без него сделал, вроде картинки рисуются на кнопке. Стоит ли так выполнять отрисовку?

Спасибо.
Автор: shadow user777
Дата сообщения: 01.12.2008 13:35
Yozj
Так как в програмировании я почти 0, конечно хочется автоконвертер
Ладно, билдер поставил, щас начну сражатся

Кстати для начинающих, хочу порекомендовать продукт Hiasm http://hiasm.com/index.html
В нем можно сделать почти ВСЕ. И разбиратся в программировании не обязательно. Все делается в визуальном редакторе.
Аналог Дэльфи и прочих билдеров.
Автор: Yozj
Дата сообщения: 01.12.2008 13:41
shadow user777
Да, мне нравится эта программа, отлично подходит если не надо привязываться к языку и надо быстро что-то сделать.
Ошибка в ссылке: http://hiasm.com/index.html
Автор: Frodo_Torbins
Дата сообщения: 01.12.2008 19:30
HiAsm штука действительно интересная, но для тех, кто умеет программировать, почти бесполезная. По крайней мере я так и не смог найти ему применение, когда разбирался с ним.
Автор: ShIvADeSt
Дата сообщения: 02.12.2008 01:44
Maks150988
В том то и дело, что твои исходники я скачал и посмотрел. Увидел много похожего с моими сорсами, чтобы не искать ошибки у тебя - предложил тебе свои. В общем, несколько советов. Если тебе надо использовать переменные внутри только одной процедуры (функции), то объявляй их внутри этой процедуры. Никогда так не делай

Код:
procedure PaintImageFileButton(DC : HDC; RtBtn : TRect; szPathFile : WideString);
begin
CompDC := CreateCompatibleDC(0);
NewBmp := LoadImageW(hInstance, PWideChar(szPathFile), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE);
OldBmp := SelectObject(CompDC, NewBmp);
BitBlt(PS.hDC, 0, 0, RtBtn.Right - RtBtn.Left, RtBtn.Bottom - RtBtn.Top, CompDC, 0, 0, SRCCOPY);
SelectObject(CompDC, OldBmp);
DeleteDC(CompDC);
DeleteObject(NewBmp);
end;
Автор: Maks150988
Дата сообщения: 02.12.2008 08:58
ShIvADeSt
Спасибо. А как тогда поступать, если хочется поболее кнопок разрисовать. Понимаю что глупо, но сделал вот так: [more=Подробнее]program hButton;

{$R hButton.res}

uses
Windows, Messages;

const
RES_DIALOG = 101;
RC_BUTTON_1 = 101;
RC_BUTTON_2 = 102;

var
hApp : Thandle;
OldBtnProc: Pointer;
MouseOver : boolean;

procedure PaintImageFileButton(DC: HDC; Rect: TRect; szPathFile: WideString);
var
NewBmp: HBITMAP;
OldBmp: HBITMAP;
CompDC: HDC;
begin
CompDC := CreateCompatibleDC(0);
NewBmp := LoadImageW(hInstance, PWideChar(szPathFile), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE);
OldBmp := SelectObject(CompDC, NewBmp);
BitBlt(DC, 0, 0, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, CompDC, 0, 0, SRCCOPY);
SelectObject(CompDC, OldBmp);
DeleteDC(CompDC);
DeleteObject(NewBmp);
end;

function DrawCloseButton(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
Point: TPoint;
Rect : TRect;
begin
case uMsg of
WM_MOUSEMOVE:
begin
GetCursorPos(Point);
GetWindowRect(hWnd, Rect);
if PtInRect(Rect, Point) then
begin
if GetCapture <> hWnd then
begin
SetCapture(hWnd);
MouseOver := TRUE;
InvalidateRect(hWnd, nil, FALSE);
end;
end
else
begin
ReleaseCapture;
MouseOver := FALSE;
InvalidateRect(hWnd, nil, FALSE);
end;
end;
end;
Result := CallWindowProcW(OldBtnProc, hWnd, uMsg, wParam, lParam);
end;

procedure Button_OnDrawItemW(lpdis: PDRAWITEMSTRUCT; szPathClose, szPathNormal, szPathOver: WideString);
begin
if (lpdis.itemState and ODS_SELECTED) <> 0 then
PaintImageFileButton(lpdis.hDC, lpdis.rcItem, szPathClose)
else
PaintImageFileButton(lpdis.hDC, lpdis.rcItem, szPathNormal);
if MouseOver and not ((lpdis.itemState and ODS_SELECTED) <> 0) then
PaintImageFileButton(lpdis.hDC, lpdis.rcItem, szPathOver);
end;

function MainWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM) : BOOL; stdcall;
var
Rect: TRect;
PS : TPaintStruct;
begin
Result := TRUE;
case uMsg of

WM_INITDIALOG:
begin
hApp := hWnd;
// SetWindowLongW(hApp, GWL_EXSTYLE, GetWindowLong(hApp, GWL_EXSTYLE) or WS_EX_LAYERED);
// SetLayeredWindowAttributes(hApp, $00FF00FF, 255, LWA_COLORKEY + LWA_ALPHA);
OldBtnProc := Pointer(GetWindowLongW(GetDlgItem(hApp, RC_BUTTON_1), GWL_WNDPROC));
SetWindowLongW(GetDlgItem(hApp, RC_BUTTON_1), GWL_WNDPROC, LongInt(@DrawCloseButton));
OldBtnProc := Pointer(GetWindowLongW(GetDlgItem(hApp, RC_BUTTON_2), GWL_WNDPROC));
SetWindowLongW(GetDlgItem(hApp, RC_BUTTON_2), GWL_WNDPROC, LongInt(@DrawCloseButton));
end;

WM_PAINT:
begin
GetClientRect(hApp, Rect);
BeginPaint(hApp, PS);
PaintImageFileButton(PS.hDC, Rect, 'MainWindow.bmp');
EndPaint(hApp, PS);
end;

WM_DRAWITEM:
begin
case LoWord(wParam) of
RC_BUTTON_1:
Button_OnDrawItemW(PDRAWITEMSTRUCT(lParam), 'CloseButtonDown.bmp', 'CloseButtonNormal.bmp', 'CloseButtonOver.bmp');
RC_BUTTON_2:
Button_OnDrawItemW(PDRAWITEMSTRUCT(lParam), 'CloseButtonDown.bmp', 'CloseButtonNormal.bmp', 'CloseButtonOver.bmp');
end;
end;

WM_CLOSE, WM_DESTROY:
PostQuitMessage(0);

else
Result := FALSE;
end;
end;

begin
DialogBoxW(hInstance, PWideChar(RES_DIALOG), 0, @MainWndProc);
end.[/more]

Нужно в цикле как-нибудь пронумеровать DrawCloseButton для каждой кнопки или можно одну эту функцию использовать для всех кнопок или просто OldBtnProc в массив засунуть и для каждой кнопки засабклассить? А то сейчас, например, навели на кнопку курсор и нажали, цвет у другой сменился на активный, хотя не должно так быть.
Хочется универсального решения с минимальным кодом.

Цитата:
Для чего ты передаешь в процедуру указатель контекста, если рисуешь в итоге на другом.

То есть? Имеется ввиду PaintImageFileButton? Если да, то там рисуется на DC, а это уже может быть и PDRAWITEMSTRUCT и TPaintStruct. Вроде универсально...
Автор: ShIvADeSt
Дата сообщения: 02.12.2008 10:08
Maks150988

Цитата:
То есть? Имеется ввиду PaintImageFileButton? Если да, то там рисуется на DC, а это уже может быть и PDRAWITEMSTRUCT и TPaintStruct. Вроде универсально...

Посмотри что передаешь и на чем рисуешь. Передаешь
Цитата:
PaintImageFileButton(DC : HDC;

а рисуешь
Цитата:
BitBlt(PS.hDC,
. А все из-за того, что очень много глобальных переменных, поэтому не ругалось.

Цитата:
Хочется универсального решения с минимальным кодом.

Сам такое хочу найти Все что нашел в инете - это создавать класс кнопок, тогда у каждой кнопки будет свой MouseOver и соответственно только нужная кнопка будет отрисовываться.
Автор: delover
Дата сообщения: 02.12.2008 13:05
А не подскажете, у меня тут программа написана вроде на i86, раньше она работала. она вызывает int 10 c ax 80 наверное переключает текстовый режим, на тот же самый текстовый режим, в результате чего консоль разворачивается на весь экран. А сейчас она не реботает. Незнаю почему, может можно как-то исправить прогу?
Автор: Yozj
Дата сообщения: 02.12.2008 13:17
delover
Под какой ОС программа?
По моему Windows XP, Vista механизм прерываний полностью блокируют.
Автор: delover
Дата сообщения: 02.12.2008 14:48
Yozj
А под Windows 98 нормально работает. Понятно же что Virtual PC на домашнем Vista тоже синий экран может показывать. Как вот он это делает? И главно потом Alt-Tab не работает почему-то.
Автор: Yozj
Дата сообщения: 02.12.2008 15:22
delover
Так Win98 - совсем другая архитектура ядра и понятия безопасности. А как обрабатывают такие прерывания эмуляторы - вопрос к ним, далеко не факт что под ними это возможно.
Автор: akaGM
Дата сообщения: 02.12.2008 16:30
delover
DosBox -- наше всё...
www.dosbox.com
Автор: Maks150988
Дата сообщения: 02.12.2008 19:50
ShIvADeSt
А у Вас случайно нет кода, как отрегионить кнопку по определенному цвету? И вот немного не понимаю как сделать такое. Имеем битмап, цвет для прозрачности фуксия, загружаем битмап и по этому цвету регионим кнопку, сама кнопка отображается нормально как надо - ее место в которое с регионами отцапано не "закрашивает" картинку диалога.
Сделал пока так http://webdrive.avtograd.ru/Download/Explorer/temp/hbutton.zip но это не выход красить задний неиспользуемый якобы фон самого битмапа кнопки. Ведь можно также фуксией закрасить и тогда квадратная кнопка будет в своей красе с прозрачностью что не гуд.
Автор: ShIvADeSt
Дата сообщения: 03.12.2008 01:43
Maks150988
Посмотри тут http://jhekasoft.narod.ru/rgn_btn.htm
Автор: sadasaf
Дата сообщения: 03.12.2008 01:45
Огромная просьба, помогите решить:
Постановка задачи:
1. Номер минимального по модулю элемента массива.
2. Сумму модулей элементов массива, расположенных после первого отрица-тельного элемента.
Сжать массив, удалив из него все элементы, величина которых находится в интервале [a,b]. Освободившиеся в конце массива элементы заполнить нулями
Автор: delover
Дата сообщения: 03.12.2008 07:09
akaGM
Спасибо, скачал с исходниками, правда они на Си, а есть ли решение для Delphi Console Project? Вижу, что очень мощное средство, но пока проверить не могу, нет админских привелегий. А запуск dosshell.exe требует, кстати, нельзя что ли без admin?

Был бы благодарен за уточнения где смотреть...
Удачи.

Добавлено:
Yozj
Да не факт, наверное придётся делать по разному для Vista и Windows 98.
Автор: Maks150988
Дата сообщения: 03.12.2008 21:53
ShIvADeSt
Блин, да там VCL Я плохо разбираюсь в некоторых конструкциях кода - всякие TBitmap и подобные Image.Canvas.Pixels[0, y] смущают. Остальное впринципе не проблема под Апи переделать.

Значит, сделал вот так, подобие скина Винампа с кнопками Медиа плейера Виндовс. Вроде для примера смотрится очень даже ничего.
http://webdrive.avtograd.ru/Download/Explorer/temp/skincore.zip
Только есть вопросик. Почему не работают пункты системного контекстного меню - WM_CONTEXTMENU? Эм, без понятия если честно. False возвращаю, а толку... и еще одна особенность. После запуска программки если вызвать это меню - оно как-бы не поиницализировано чтоли - пункты без изменения и все активны. А вот если подвигать диалог программы - пункты принимают впринципе нормальный вид - пункт закрытия выделяется жирным шрифтом и другие пункты неактивны становятся. Но если жать на пункты - не работают. В чем собственно дело?

А функцию переделал так:


Код: function BitmapToRgn(szPathFile: WideString): HRGN;
var
Bitmap: HBITMAP;
BmpInfo : TBitmapInfo;
TmpRgn: HRGN;
x, y: integer;
ConsecutivePixels: integer;
TranparentColor: COLORREF; //Прозрачный цвет
CurrentPixel: COLORREF;
CurrentColor: COLORREF;
MskBmpDC:HDC;
begin

Bitmap := LoadImageW(hInstance, PWideChar(szPathFile), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(Bitmap, SizeOf(BmpInfo), @BmpInfo);
Result := CreateRectRgn(0, 0, BmpInfo.bmiHeader.biWidth, BmpInfo.bmiHeader.biHeight);
if (BmpInfo.bmiHeader.biWidth = 0) or (BmpInfo.bmiHeader.biHeight = 0) then
exit;
MskBmpDC := CreateCompatibleDC(0);
SelectObject(MskBmpDC, Bitmap);
TranparentColor := GetPixel(MskBmpDC, x, y);
for y := 0 to BmpInfo.bmiHeader.biHeight - 1 do
begin
CurrentColor := GetPixel(MskBmpDC,0, y);
ConsecutivePixels := 1;
for x := 0 to BmpInfo.bmiHeader.biWidth - 1 do
begin
CurrentPixel := GetPixel(MskBmpDC,x, y);
if CurrentColor = CurrentPixel then
inc(ConsecutivePixels)
else
begin
if CurrentColor = TranparentColor then
begin
TmpRgn := CreateRectRgn(x - ConsecutivePixels, y, x, y + 1);
CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
DeleteObject(TmpRgn);
end;
CurrentColor := CurrentPixel;
ConsecutivePixels := 1;
end;
end;
end;
DeleteObject(Bitmap);
DeleteDC(MskBmpDC);
if (CurrentColor = TranparentColor) and (ConsecutivePixels > 0) then
begin
TmpRgn := CreateRectRgn(x - ConsecutivePixels, y, x, y + 1);
CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
DeleteObject(TmpRgn);
end;
end;
Автор: ShIvADeSt
Дата сообщения: 04.12.2008 03:37
Maks150988
Вот мой код, в свое время сам переводил с ВБ на Дельфи битмапку в регион

Код:
function MakeRegion(DC:HDC):HRGN;
var
x,y,StartLineX :integer;
FullRegion,LineRegion :HRGN;
TransparentColor :COLORREF;
InFirstRegion,_InLine :Boolean;
PicWidth,PicHeight :integer;
begin
DC:=DC;
PicWidth:=96;
PicHeight:=80;
InFirstRegion:=True;
_InLine:=False;
StartLineX:=0;
TransparentColor:=GetPixel(DC,0,0);
for Y:=0 to PicHeight-1 do
for X:=0 to PicWidth-1 do
if (GetPixel(DC, X, Y)=TransparentColor)then begin
if _InLine then begin
_InLine:=False;
LineRegion:=CreateRectRgn(StartLineX,Y,X,Y+1);
if InFirstRegion then begin
FullRegion:=LineRegion;
InFirstRegion:=False;
end
else begin
CombineRgn(FullRegion, FullRegion, LineRegion, RGN_OR);
DeleteObject(LineRegion);
end;
end
end
else
If NOT _InLine then begin
_InLine:=True;
StartLineX:=X;
end;
Result:=FullRegion;
end;
Автор: delover
Дата сообщения: 04.12.2008 06:57
Maks150988
В VCL объект TBitmap занимается хранением данных и тесно повязан на TIcon и TImageList. В случае с TIcon нужно рисовать транспаренту, а в случае с TImageList нужно уметь компоновать разные катинки в одну. Так что Pixels[] лучше использовать только для транспарента, есть же много Draw-ов. WM_CONTEXTMENU по идее должен соответствовать OnContextMenu любого TControl, опять же апи может непонимать контролов.
Автор: ShIvADeSt
Дата сообщения: 04.12.2008 08:36
Maks150988

Цитата:
Только есть вопросик. Почему не работают пункты системного контекстного меню - WM_CONTEXTMENU? Эм, без понятия если честно. False возвращаю, а толку... и еще одна особенность.

попробуй системное меню через TrackPopupMenu вызывать. Я просто не помню, чтобы у меня такая проблема была с системным меню.
Автор: Maks150988
Дата сообщения: 04.12.2008 14:12
delover
Дык я на чистом Апи делаю прогамму, мне эти ТБитмап не нужны. Мне б только знать как перевести некоторый код с этого дурацкого VCL. Вот например самое простое - Image.Width это можно через GetObject у загруженной картинки узнать, а Image.Canvas.Pixels[0, 0] я подумал что это в Апи GetPixel(MskBmpDC,0, y) куда предварительно поместил битмап через SelectObject. так вроде смотрю считай одно и тоже.

ShIvADeSt
Так я вызываю через ТрекПопапМеню.


Код: hSysMenu := GetSystemMenu(hApp, FALSE);
//
WM_CONTEXTMENU:
begin
GetCursorPos(lpPoint);
GetWindowRect(hApp, lpRect);
lpRect.Bottom := lpRect.Top + 18;
//ClientToScreen(hApp, lpPoint);
if PtInRect(lpRect, lpPoint) then
begin
SetForegroundWindow(hApp);
TrackPopupMenu(hSysMenu, TPM_LEFTALIGN or TPM_LEFTBUTTON, lpPoint.X, lpPoint.Y, 0, hApp, nil);
PostMessage(hApp, WM_NULL, 0, 0);
//Result := 1;
end;
Result := 1;
end;
Автор: AlexIntegral
Дата сообщения: 04.12.2008 20:28
Помогите пожалуйста с задачкой, она не сложная, но я затрудняюсь решить её. Она с использованием оператора if


Код: Составьте программу вычисления числа дней в месяце. Даны: номер месяца – целое число от 1 до 12, признак високосного года – целое число, равное 1 для високосного года и 0 в противном случае (признак високосного года – номер високосного года делится на 4 нацело).
Автор: Yozj
Дата сообщения: 04.12.2008 20:34
AlexIntegral
Модератор поправит, но тебе похоже в ветку с паскалем.
А по существу - на каком языке надо писать, Delphi или Turbo Pascal?
Автор: AlexIntegral
Дата сообщения: 04.12.2008 21:05
На Delphi, передо мной среда разработки Delphi 7, а в мысли на счёт задачи никакой. Помогите кто чем
Автор: Yozj
Дата сообщения: 04.12.2008 21:19
AlexIntegral
А что в лекциях пишут?
Если с IF, то простейший вариант:
Положи на форму TEdit, TLabel, TButton, TCheckBox.
Щелкни два раза на Button и напиши там код:

Код:
if Edit1.Text = '1' then
Label1.Caption := '31'
else if (Edit1.Text = '2') and (CheckBox1.Checked) then
Label1.Caption := '29'
else if (Edit1.Text = '2') and (not CheckBox1.Checked) then
Label1.Caption := '28'
else if Edit1.Text = '3' then
Label1.Caption := '31'
else if Edit1.Text = '4' then
Label1.Caption := '30'
else if Edit1.Text = '5' then
Label1.Caption := '31'
else if Edit1.Text = '6' then
Label1.Caption := '30'
else if Edit1.Text = '7' then
Label1.Caption := '31'
else if Edit1.Text = '8' then
Label1.Caption := '31'
else if Edit1.Text = '9' then
Label1.Caption := '30'
else if Edit1.Text = '10' then
Label1.Caption := '31'
else if Edit1.Text = '11' then
Label1.Caption := '30'
else if Edit1.Text = '12' then
Label1.Caption := '31'
Автор: dscp50
Дата сообщения: 04.12.2008 22:17
в одном окне необходимо реализовать копирование файлов, по идее все просто, но в delphi я вообще не силен, последнее что писал - лицейские математические задачки, и никаких знаний функций взаимодействия с файлами и папками не знаю =(

в общем нужно что-то типа этого, подскажите, пожалуйста, у кого какие есть догадки по этому поводу,
попытаюсь доработать сам, въезжаю быстро))

http://img355.imageshack.us/img355/1944/79633088lt8.jpg

+на скрин еще кнопочку "copy" ))
Автор: Yozj
Дата сообщения: 04.12.2008 22:25
dscp50
Ищи в сторону FindFirst, FindNext, посмотри Help по этому делу, там же стандартные функции копирования.
Автор: ShIvADeSt
Дата сообщения: 05.12.2008 03:33
Maks150988

Цитата:
Так я вызываю через ТрекПопапМеню.

Погуглил - проблема не нова, вот один из вариантов решения

Код:
WM_CONTEXTMENU:
begin
hMenu := GetSystemMenu(hWnd, False);
SetMenuDefaultItem(hMenu,SC_CLOSE,0);
GetCursorPos(Cur);
GetWindowRect(hWnd, Rect);
Rect.Bottom := Rect.Top + 22;
if PtInRect(Rect, Cur) then
begin
SetForegroundWindow(hWnd);
hMenuItem:=LongWord(TrackPopupMenu(hMenu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RETURNCMD , Cur.X, Cur.Y, 0, hWnd, nil));
if hMenuItem > 0 then
SendMessage(hWnd, WM_SYSCOMMAND, hMenuItem, 0);
PostMessage(hWnd, WM_NULL, 0, 0);
end;
Result := True;
end;
Автор: samusev
Дата сообщения: 05.12.2008 15:53
Переклинило..

Требуется разбить огромный текстовый (внимание UTF-8) файл на несколько маленьких.

как текстовый посторочно читается в Юникод строку?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.