Zireael |
Отправлено: 27 Мая, 2019 - 01:38:34
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
code (Отобразить)CODE:#define WS_VISIBLE 268435456
#define WS_CHILD 1073741824
#define SS_NOTIFY 256
#define PS_NULL 5
#define PS_SOLID 0
#define SRCCOPY 13369376
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "GetDC", "GetDC", "User32.dll");
external(INT, "CreateCompatibleDC", "CreateCompatibleDC", "Gdi32.dll" );
external(INT, "CreateCompatibleBitmap", "CreateCompatibleBitmap", "Gdi32.dll" );
external(INT, "CreatePen", "CreatePen", "Gdi32.dll");
external(INT, "CreateSolidBrush", "CreateSolidBrush", "Gdi32.dll");
external(INT, "SelectObject", "SelectObject", "Gdi32.dll");
external(INT, "Polyline", "Polyline", "Gdi32.dll");
external(INT, "Rectangle", "Rectangle", "Gdi32.dll");
external(INT, "TextOut", "TextOutA", "Gdi32.dll" );
external(INT, "SetBkColor", "SetBkColor", "Gdi32.dll" );
external(INT, "SetBkMode", "SetBkMode", "Gdi32.dll" );
external(INT, "SetTextColor", "SetTextColor", "Gdi32.dll" );
external(INT, "BitBlt", "BitBlt", "Gdi32.dll" );
int i, j;
int dialog_w=300, dialog_h=300; // ширина и высота диалога
int hdc, DC, bitmapDC;
int pen0, pen1, pen2, pen3, pen4, brush1, brush2, brush_check, brush_fon;
pen0=CreatePen(PS_NULL, 0, 0);
pen1=CreatePen("PS_SOLID", 2, 0);
pen2=CreatePen("PS_SOLID", 3, 0);
brush_fon=CreateSolidBrush(16704166); // фон для диалога
brush1=CreateSolidBrush(3795591); // фон для прямоугольника (зелёный)
brush2=CreateSolidBrush(15790320); // фон для прямоугольника
brush_check=CreateSolidBrush(0);
int check_status[5]={0,0,0,0,0} // статус галок
int coord_check[20]={ // координаты галок
15, 40, 30, 55,
15, 60, 30, 75,
15, 80, 30, 95,
15, 100, 30, 115,
15, 120, 30, 135}
int checked_arr[6]={2, 6, 5, 10, 10, 3} // для рисования галки
createdialog(0);
showdialog(0, "Диалог",100, 100, dialog_w, dialog_h, 1, 1);
enabletimer(0);
loop()sleep(1);
function getmessage(0, WM_CREATE)
{
hdc=GetDC(gethwnd(0));
DC=CreateCompatibleDC(hdc);
bitmapDC=CreateCompatibleBitmap(hdc, dialog_w, dialog_h);
SelectObject(DC, bitmapDC);
}
CREATE_TIMER(0, 50)
{
SelectObject(DC, brush_fon); // выбираем кисть
SelectObject(DC, pen0); // выбираем перо
Rectangle(DC, 0, 0, dialog_w, dialog_h); // фон диалога
rectangle(DC, 10, 10, 110, 35, brush1); // зеленый прямоугольник
text_out(DC, 15, 15, "Текст1", 10301743); // текст
rectangle(DC, 10, 35, 110, 140, brush2); // белый прямоугольник
// check, чёрный квадрат рисуется всегда, галка если она выбрана
for(i=0; i<5; i++)
{
check(DC, coord_check[i*4], coord_check[i*4+1], coord_check[i*4+2], coord_check[i*4+3], pen1, brush2);
if(check_status[i])checked(DC, i, #checked_arr[0], sizearray(checked_arr) / 2, pen2);
}
text_out(DC, 40, 38, "Текст3", 255); // текст галок
text_out(DC, 40, 58, "Текст4", 255);
text_out(DC, 40, 78, "Текст5", 255);
BitBlt(hdc, 0, 0, dialog_w, dialog_h, DC, 0, 0, SRCCOPY); // вывод всего что нарисованно на диалог
}
function rectangle(int HDC, int x, int y, int x2, int y2, int brush)
{
int old_brush=SelectObject(HDC, brush);
Rectangle(HDC, x, y, x2, y2);
SelectObject(HDC, old_brush);
}
function check(int HDC, int x, int y, int x2, int y2, int pen, int brush)
{
int old_brush=SelectObject(HDC, brush);
int old_pen=SelectObject(HDC, pen);
Rectangle(HDC, x, y, x2, y2);
SelectObject(HDC, old_brush);
SelectObject(HDC, old_pen);
}
function checked(int HDC, int i, int #point, int size_arr, int pen)
{
int a[6];
a[0]=coord_check[i*4]+point[0];
a[1]=coord_check[i*4+1]+point[1];
a[2]=coord_check[i*4]+point[2];
a[3]=coord_check[i*4+1]+point[3];
a[4]=coord_check[i*4]+point[4];
a[5]=coord_check[i*4+1]+point[5];
int old_pen=SelectObject(HDC, pen);
Polyline(HDC, address(#a[0]), size_arr);
SelectObject(HDC, old_pen);
}
function text_out(int HDC, int x, int y, string text, int color)
{
char c[999]; strcpy(#c[0], text);
SetBkMode(HDC, 1);
SetBkColor(HDC, 0);
SetTextColor(HDC, color);
TextOut(HDC, x, y, address(#c[0]), size(#c[0]));
}
function getmessage(0, WM_LBUTTONDOWN)
{
for(j=0; j<5; j++)
{
if(message.x>coord_check[j*4] && message.x<coord_check[j*4]+100 && message.y>coord_check[j*4+1] && message.y<coord_check[j*4+3])
{
if(check_status[j])check_status[j]=0;
else check_status[j]=1;
return;
}
}
}
Проблема где-то в function getmessage(0, WM_LBUTTONDOWN). Если её убрать, то ошибок нет.
Кликаем левой кнопкой мыши в любом месте окна (можно галки ставить/убирать).
Ошибка может быть в разных местах, при включённом отладчике быстрее появляется. Из проблем только эту нашёл:
Цитата: for ( j = 0 ; j'4' < 5 ; j'4' ++ )
if ( message.x'22' > coord_check'15' [ j'0' * 4 ] && message.x'22' < coord_check'15' [ j'0' * 4 ] + 100 && message.y'127' > coord_check'15' [ j'0' * 4 + 1 ] && message.y'127' < coord_check'15' [ j'0' * 4 + 3 ] )
if ( message.x'22' > coord_check'15' [ j'1' * 4 ] && message.x'22' < coord_check'15' [ j'1' * 4 ] + 100 && message.y'127' > coord_check'60' [ j'1' * 4 + 1 ] && message.y'127' < coord_check'75' [ j'1' * 4 + 3 ] )
if ( message.x'22' > coord_check'15' [ j'2' * 4 ] && message.x'22' < coord_check'15' [ j'2' * 4 ] + 100 && message.y'127' > coord_check'30' [ j'2' * 4 + 1 ] && message.y'127' < coord_check'30' [ j'2' * 4 + 3 ] )
if ( message.x'22' > coord_check'15' [ j'3' * 4 ] && message.x'22' < coord_check'15' [ j'3' * 4 ] + 100 && message.y'127' > coord_check'115' [ j'3' * 4 + 1 ] && message.y'127' < coord_check'6' [ j'3' * 4 + 3 ] )
if ( message.x'22' > coord_check'15' [ j'4' * 4 ] && message.x'22' < coord_check'15' [ j'4' * 4 ] + 100 && message.y'127' > coord_check'2' [ j'4' * 4 + 1 ] && message.y'127' < coord_check'36696' [ j'4' * 4 + 3 ] )
Такого числа нет в коде. |
|
|
Zireael |
Отправлено: 02 Июня, 2019 - 19:23:08
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Работает:
CODE:#define WS_MINIMIZEBOX 131072
#define GWL_STYLE -16
external(INT, "SetWindowLong", "SetWindowLongA", "User32.dll" );
external(INT, "GetWindowLong", "GetWindowLongA", "User32.dll" );
createdialog(0);
showdialog(0, "Диалог",0, 0, 300, 300, 1, 1);
sleep(3000);
function getmessage(0, WM_CREATE)
{
int style=GetWindowLong(gethwnd(0), -16);
SetWindowLong(gethwnd(0), -16, style + WS_MINIMIZEBOX); // убрать кнопку свернуть
}
Не работает:
Цитата: #define WS_MINIMIZEBOX 131072
#define GWL_STYLE -16
external(INT, "SetWindowLong", "SetWindowLongA", "User32.dll" );
external(INT, "GetWindowLong", "GetWindowLongA", "User32.dll" );
createdialog(0);
showdialog(0, "Диалог",0, 0, 300, 300, 1, 1);
sleep(3000);
function getmessage(0, WM_CREATE)
{
SetWindowLong(gethwnd(0), -16, GetWindowLong(gethwnd(0), -16) + WS_MINIMIZEBOX); // убрать кнопку свернуть
} |
|
|
007wan |
Отправлено: 03 Июня, 2019 - 10:12:59
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Zireael , Kibor , Спасибо большое!
(Добавление)
Zireael пишет: Работает:
CODE:#define WS_MINIMIZEBOX 131072
#define GWL_STYLE -16
external(INT, "SetWindowLong", "SetWindowLongA", "User32.dll" );
external(INT, "GetWindowLong", "GetWindowLongA", "User32.dll" );
createdialog(0);
showdialog(0, "Диалог",0, 0, 300, 300, 1, 1);
sleep(3000);
function getmessage(0, WM_CREATE)
{
int style=GetWindowLong(gethwnd(0), -16);
SetWindowLong(gethwnd(0), -16, style + WS_MINIMIZEBOX); // убрать кнопку свернуть
}
Не работает:
Цитата: #define WS_MINIMIZEBOX 131072
#define GWL_STYLE -16
external(INT, "SetWindowLong", "SetWindowLongA", "User32.dll" );
external(INT, "GetWindowLong", "GetWindowLongA", "User32.dll" );
createdialog(0);
showdialog(0, "Диалог",0, 0, 300, 300, 1, 1);
sleep(3000);
function getmessage(0, WM_CREATE)
{
SetWindowLong(gethwnd(0), -16, GetWindowLong(gethwnd(0), -16) + WS_MINIMIZEBOX); // убрать кнопку свернуть
}
WS_EX_CONTEXTHELP 1024 не работает. Заменил на WS_MINIMIZEBOX |
|
|
Zireael |
Отправлено: 03 Июня, 2019 - 11:51:06
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: #define WS_CHILD 1073741824
#define WS_VISIBLE 268435456
#define WS_BORDER 8388608
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
int edit;
createdialog(0);
createdialog(1); // из-за этого текст в edit сразу выделен
showdialog(0, "Bot",300, 300, 300, 300, 1, 1);
loop()sleep(10);
function getmessage(0, WM_CREATE)
{
edit=CreateWindow(0, "EDIT", "1", WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 60, 30, 20, gethwnd(0), 0, 0, 0); // edit
messagebox(edit); // если убрать function getmessage(0, WM_COMMAND), то хендл будет получен
}
function getmessage(0, WM_COMMAND)
{
} |
|
|
|