Возник некоторый геморой с PB. Юзаю именно его, т.к. мне нужна обычная ДЛЛка, которая создаёт GUI.
1) Что-то очень геморойно делаются контролы с изогбражениями (IMAGEBUTTON и PICTUREBOX). Сама картинка в них должна загружаться из файла ресурсов. Есть ли способ это обойти? Мне просто картинки нужно задавать по ходу выполнения программы.
2) Проблема с ХР-контролами. Я юзаю manifest. Тык вот все контролы выглядят как надо, но когда делаешь TAB-контрол, то фоновый цвет других контролов не меняется если они находятся в нём (от этого всё выглядит убого). Делал контролы дочерними и пробовал сразу создавать внутри TAB'а - ничего не помогает.
Второй вопрос не "экстренный". Если ХРшных контролов не будет, то я не сильно расстроюсь. Вот первый вопрос - это конечно даааааа...
Если кто может с чем помочь, то скажу "спасиба" :)
Проще всего использовать обычный SS_BITMAP static вместо PICTUREBOX. Картинку в нем можно поменять в любой момент, послав ему сообщение STM_SETIMAGE с хэндлом битмапа в wParam'e. Битмап можно загружать как из ресурсов, так и из файла или ещё каким способом.
А с IMGBUTTON - проще пристрелить скотину, чем делать из неё что-то достойное внимания. И использовать какой-нибудь контрол-кнопку, позволяющую менять картинку. Либо рисовать кнопку самому, например на основе статика - тут вообще никаких ограничений, только твоя фантазия.
Значёк сделать очень просто. Создаешь RC-файл, а в нём пишешь имя значка, такое же как и имя экзешника. Затем всё это дело переводишь в PBR и в исходник добавляешь метаоператор #RESOURCE "MyRes.PBR"
Dim hStatic as LONG
Dim Ret AS LONG
hStatic = CreateWindowEx(0,
"static",
"",
%WS_CHILD or %SS_ICON,
2,
2,
100,
100,
hParent,
2000,
hInstance,
0)
iHnd& = LoadImage(0,"C:\DELETE.BMP",0,0,0,&H10)
Ret = SendMessage(hStatic,%STM_SETIMAGE,%IMAGE_BITMAP,iHnd&
2CyRax
Тык вот мне лучше этот значок через саму ДЛЛовкую функцию и задать. Я эту ДЛЛ пишу для ламеров и себя, поэтому всё должно быть предельно просто. Чтоб к их играм\прогам никаких лишних файлов (ресурсов) не лепить. Только ДЛЛ. А значок задавался типа: CALL DLL dll#,icon_path$ и всё.... Поэтому файл ресурсов мне никак...
Вот этот пример есть в папке c примерами PBWin70,
zя тут добавил статик и объявления переменных. Картинка отображается в статике. Только измени название файла с "c:\test.bmp" на своё. Тут много чего лишнего, просто писать с нуля лень , вот и прицепил к примеру статик.
#INCLUDE "WIN32API.INC"
'#RESOURCE "HELLOWIN.PBR" ' this gives the program the "hellowin" icon
FUNCTION WINMAIN (BYVAL hInstance AS DWORD, _
BYVAL hPrevInstance AS DWORD, _
BYVAL lpCmdLine AS ASCIIZ PTR, _
BYVAL iCmdShow AS LONG) AS LONG
LOCAL Msg AS tagMsg
LOCAL wce AS WndClassEx
LOCAL szAppName AS ASCIIZ * 80
LOCAL hWnd AS DWORD
LOCAL hStatic AS DWORD
LOCAL hBitmap AS DWORD
LOCAL Ret AS LONG
szAppName = "HelloWin"
wce.cbSize = SIZEOF(wce)
wce.style = %CS_HREDRAW OR %CS_VREDRAW
' CODEPTR is used to pass the address of the function that will
' receive all messages sent to any window created with this class
wce.lpfnWndProc = CODEPTR(WndProc)
wce.cbClsExtra = 0
wce.cbWndExtra = 0
wce.hInstance = hInstance
wce.hIcon = LoadIcon(hInstance, "HELLOWIN"
wce.hCursor = LoadCursor(%NULL, BYVAL %IDC_ARROW)
wce.hbrBackground = %NULL ' No class background, we do it outselves
wce.lpszMenuName = %NULL
wce.lpszClassName = VARPTR(szAppName)
wce.hIconSm = LoadIcon(hInstance, BYVAL %IDI_APPLICATION)
RegisterClassEx wce
' Create a window using the registered class
hWnd = CreateWindow(szAppName, _ ' window class name
"The Hello Program", _ ' window caption
%WS_OVERLAPPEDWINDOW, _ ' window style
%CW_USEDEFAULT, _ ' initial x position
%CW_USEDEFAULT, _ ' initial y position
%CW_USEDEFAULT, _ ' initial x size
%CW_USEDEFAULT, _ ' initial y size
%NULL, _ ' parent window handle
%NULL, _ ' window menu handle
hInstance, _ ' program instance handle
BYVAL %NULL) ' creation parameters
hStatic = CreateWindow("static", _ ' window class name
"", _ ' window caption
%WS_CHILD OR %WS_VISIBLE OR %SS_BITMAP, _ ' window style
20, _ ' initial x position
20, _ ' initial y position
100, _ ' initial x size
100, _ ' initial y size
hWnd, _ ' parent window handle
%NULL, _ ' window menu handle
hInstance, _ ' program instance handle
BYVAL %NULL) ' creation parameters
hBitmap = LoadImage(0,"C:\test.bmp",0,0,0,&H10)
Ret = SendMessage(hStatic,%STM_SETIMAGE,%IMAGE_BITMAP,hBitmap)
IF hWnd = 0 THEN
MSGBOX "Unable to create window"
EXIT FUNCTION
END IF
' Display the window on the screen
ShowWindow hWnd, iCmdShow
UpdateWindow hWnd
' Main message loop:
' Messages sent to HELLOWIN while it has the focus are received by
' GetMessage(). This loop translates each message and dispatches it
' to the appropriate handler. When PostQuitMessage() is called, the
' loop terminates which ends the application.
 O WHILE GetMessage(Msg, %NULL, 0, 0)
TranslateMessage Msg
 ispatchMessage Msg
LOOP
FUNCTION = msg.wParam
END FUNCTION
SUB DrawGradient (BYVAL hDC AS DWORD)
LOCAL rectFill AS RECT
LOCAL rectClient AS RECT
LOCAL fStep AS SINGLE
LOCAL hBrush AS DWORD
LOCAL lOnBand AS LONG
' WndProc is the message handler for all windows creating using the HelloWin
' class name. A single WndProc procedure can handle multiple windows by
' testing the hWnd variable passed to it.
FUNCTION WndProc (BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, _
BYVAL wParam AS DWORD, BYVAL lParam AS LONG) EXPORT AS LONG
LOCAL hDC AS DWORD
LOCAL pPaint AS PAINTSTRUCT
LOCAL tRect AS RECT
' The SELECT CASE is used to catch only those messages which the message
' handler needs to process. All other messages are passed through the
' tests to the default handler.
SELECT CASE wMsg
CASE %WM_CREATE
CASE %WM_PAINT
hDC = BeginPaint(hWnd, pPaint)
GetClientRect hWnd, tRect
SetBkMode hDC, %TRANSPARENT
SetTextColor hDC, %WHITE
 rawText hDC, "Hello, Windows!", -1, tRect, %DT_SINGLELINE OR %DT_CENTER OR %DT_VCENTER
EndPaint hWnd, pPaint
FUNCTION = 1
EXIT FUNCTION
CASE %WM_ERASEBKGND
hDC = wParam
 rawGradient hDC ' Pass the DC of the region to repaint
FUNCTION = 1
EXIT FUNCTION
CASE %WM_DESTROY
PostQuitMessage 0
FUNCTION = 0
EXIT FUNCTION
END SELECT
' Any message which is not handled in the above SELECT CASE reaches this
' point and is processed by the Windows default message handler.
FUNCTION = DefWindowProc(hWnd, wMsg, wParam, lParam)
END FUNCTION
hInstance передается как входной параметр в WinMain. Ты наверное использовал вместо WinMain PBMAIN, поэтому hInstance у тебя нет
CONTROL ADD LABEL statement Add a text label to a dialog. A text label is similar to a conventional static control.
CONTROL ADD LABEL, hDlg&, id&, txt$, x, y, xx, yy [, [style&] [, [exstyle&]]] [[,] CALL callback]
Лучше используй CreateWindowEx. Всё равно в Win32API.inc CreateWindow - это заглушка, которая вызывает CreateWindowEx.
#IF %DEF(%CCWIN)
FUNCTION CreateWindow (lpClassName AS ASCIIZ, lpWindowName AS ASCIIZ, BYVAL dwStyle AS DWORD, BYVAL xx AS LONG, BYVAL yy AS LONG, BYVAL nWidth AS LONG, _
BYVAL nHeight AS LONG, BYVAL hwndParent AS DWORD, BYVAL hMenu AS DWORD, BYVAL hInstance AS DWORD, BYVAL lpParam AS DWORD) AS LONG
FUNCTION = CreateWindowEx(0, lpClassName, lpWindowName, dwStyle, xx, yy, nWidth, nHeight, hWndParent, hMenu, hInstance, BYVAL lpParam)
END FUNCTION
#ENDIF
2HOOLIGAN
Пример не пашет. Ругается на "Multiple Main Functions have been defined"
И я делаю ДЛЛ, а не ЕХЕ. Более того, я даже не могу юзать LIBMAIN и т.п., ибо тогда ДЛЛка не загрузится (DarkBasic скажет "не могу загрузить ДЛЛ". Поэтому я вообще без неё
Вообще никак не пашет... Ни с лейблом, ни с CreateWindowEx... Ни со стандартным CONTROL SEND ни с АПИшным... Ни с нормальными параметрами, ни с какими другими.... НОЛЬ.
Ладно, не будет imgbox'ов - и хрен с ними.
Всем спасибо, народ Сорри, за дерготню и ламошность