Копировать данные в буфер пока не умеет.
Копировать данные в буфер пока не умеет.
```FreeBASIC
Const MOVE_DX = 10
Const MOVE_DY = 10
' Переменные уровня модуля:
Dim Shared MemoryDC As HDC
Dim Shared MemoryBM As HBITMAP
Dim Shared OldMemoryBM As HGDIOBJ
Dim Shared ShapeRectangle As RECT
Function MainFormWndProc(ByVal hWin As HWND, ByVal wMsg As UINT, ByVal wParam As WPARAM, ByVal lParam As LPARAM) As LRESULT
Select Case wMsg
Case WM_CREATE
' Контекст устройства окна
Dim hDC As HDC = GetDC(hWin)
' Контекст устройства в памяти
MemoryDC = CreateCompatibleDC(hDC)
' Цветной рисунок на основе окна
Dim ClientRect As RECT = Any
GetClientRect(hWin, @ClientRect)
MemoryBM = CreateCompatibleBitmap(hDC, ClientRect.right, ClientRect.bottom)
' Освобождаем контекст устройства окна, он больше не нужен
ReleaseDC(hWin, hDC)
' Выбираем цветной рисунок, сохраняя старый
OldMemoryBM = SelectObject(MemoryDC, MemoryBM)
' Положение круглешка
SetRect( _
@ShapeRectangle, _
ClientRect.right \ 2 — 20, _
ClientRect.bottom \ 2 — 20, _
ClientRect.right \ 2 + 20, _
ClientRect.bottom \ 2 + 20 _
)
' Визуализация
Render(hWin)
```
Теперь можно рисовать при изменениях сцены прямо в MemoryDC:
```FreeBASIC
Sub Render(ByVal hWin As HWND)
' Прямоугольник обновления
Dim updRect As RECT = Any
SetRect( _
@updRect, _
ShapeRectangle.left — MOVE_DX — 1, _
ShapeRectangle.top — MOVE_DY — 1, _
ShapeRectangle.right + MOVE_DX + 1, _
ShapeRectangle.bottom + MOVE_DY + 1 _
)
' Стираем старое изображение
FillRect(MemoryDC, @updRect, Cast(HBRUSH, GetStockObject(BLACK_BRUSH)))
' Рисуем
Ellipse(MemoryDC, ShapeRectangle.left, ShapeRectangle.top, ShapeRectangle.right, ShapeRectangle.bottom)
' Выводим в окно
InvalidateRect(hWin, @updRect, FALSE)
End Sub
```
В обработчике WM_ERASEBKGND просто возвращаем TRUE, давая понять системе, что фон мы уже стёрли:
```FreeBASIC
Case WM_ERASEBKGND
Return TRUE
```
В обработчике WM_PAINT копируем изменённые участки из контекста памяти в окно:
```FreeBASIC
Case WM_PAINT
Dim ps As PAINTSTRUCT = Any
Dim hDC As HDC = BeginPaint(hWin, @ps)
BitBlt(hDC, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom, _
MemoryDC, ps.rcPaint.left, ps.rcPaint.top, _
SRCCOPY _
)
EndPaint(hWin, @ps)
```
Очистка:
```FreeBASIC
Case WM_DESTROY
SelectObject(MemoryDC, OldMemoryBM)
DeleteObject(MemoryBM)
DeleteDC(MemoryDC)
PostQuitMessage(0)
```
Примечания.
1. Сохранять старый BITMAP и выбирать его обратно в процедуре очистки обязательно. Всё потому, что пока наш BITMAP выбран в контексте стройства, он не может быть удалён. Чтобы удалить наш BITMAP, надо «развыбрать» его обратно и выбрать предыдущий BITMAP. Это же относится к перьям, кистям и прочим GDI объектам, которые можно выбрать в контекст устройства.
2. Контекст устройства полученный через GetDC необходимо уничтожать через ReleaseDC. Контекст устройства полученный через CreateCompatibleDC необходимо удалять через DeleteDC. Контекст устройства, полученный через BeginPaint неявно удаляет система через EndPaint.
3. Некоторую сложность представляет изменение размера BITMAP при изменении размера окна. Когда окно меняет свой размер, то придётся уничтожать старый BITMAP и создавать новый по новому размеру клиентской области.
Регистрируя класс окна, в структуре WNDCLASS устанавливаем hbrBackground = NULL.
В WM_CREATE создаём BITMAP.
В этом BITMAP рисуем при любых изменениях сцены и вызываем функцию InvalidateRect(hwnd, lpRect, FALSE) или InvalidateRgn(hwnd, lpRegion, FALSE).
В обработчике WM_PAINT копируем участки из BITMAP в hDC окна через BitBlt, не стирая содержимого окна.
В обработчике WM_ERASEBKGND просто возвращаем TRUE — это сигнал системе, что мы стёрли фон.
Для полноэкранного окна ведь достаточно стиля WS_POPUP? Или нужно что‐то ещё?
github.com
Добавить нескучную анимацию, что ли.
Автозавершение в текстовых элементах Windows
Так и не нашёл нормальный способ вручную пинать это автозавершение, чтоб оно список перечитывало и чтоб возможные варианты принудительно показывало. Возможные варианты, пока текст не набран, отсутствуют, а даже после того, как набран, нужно получить ответ по HTTP, и только тогда есть, что показать. Объект автозавершения читает пустой список и запоминает, а когда можно что-то показать, список для автозаполнения всё равно пустой. Пока остановился на варианте с RecreateWnd + SendMessage(WM_KEYDOWN, VK_DOWN).
Изолентой там всё скручено. Тут оконные ручки и оконные функции, а тут COM-интерфейсы, а как что-то надо, так и пнуть нечего. Ни сообщение нормальное послать, ни метод интерфейса вызвать.
Так и не нашёл нормальный способ вручную пинать это автозавершение, чтоб оно список перечитывало и чтоб возможные варианты принудительно показывало. Возможные варианты, пока текст не набран, отсутствуют, а даже после того, как набран, нужно получить ответ по HTTP, и только тогда есть, что показать. Объект автозавершения читает пустой список и запоминает, а когда можно что-то показать, список для автозаполнения всё равно пустой. Пока остановился на варианте с RecreateWnd + SendMessage(WM_KEYDOWN, VK_DOWN).
Изолентой там всё скручено. Тут оконные ручки и оконные функции, а тут COM-интерфейсы, а как что-то надо, так и пнуть нечего. Ни сообщение нормальное послать, ни метод интерфейса вызвать.
написано на си с вызовами WinAPI (компилятор TCC), малый размер, мгновенный запуск, охренительная скорость, объединён с удобной консолью (возможности cmd + свои команды).
интерфейс навигации по папкам самый примитивный, ч/б, самописный
консоль красивая, цветная
также хотелось бы написать свою оболочку для программиста (замену explorer.exe): фичи те же (скорость, малый размер) + настраиваемость ВСЕХ горячих клавиш, поддержка нескольких рабочих столов. неперекрывающийся оконный менеджер (по типу awesome, subtle, i3 и xmonad в linux)
всё, что есть, оно какое-то тормозное и перегруженное
void
SspGenCheckSum(
IN PSecBuffer pMessage,
OUT PNTLMSSP_MESSAGE_SIGNATURE pSig
)
/*++
RoutineDescription:
Generate a crc-32 checksum for a buffer
Arguments:
Return Value:
Notes: This was stolen from net\svcdlls\ntlmssp\client\sign.c ,
routine SspGenCheckSum. It's possible that
bugs got copied too
--*/
typedef struct _DnsRecord { DNS_RECORD *pNext; PWSTR pName; WORD wType; WORD wDataLength; union { DWORD DW; DNS_RECORD_FLAGS S; } Flags; DWORD dwTtl; DWORD dwReserved; union { DNS_A_DATA A; DNS_SOA_DATA SOA, Soa; DNS_PTR_DATA PTR, Ptr, NS, Ns, CNAME, Cname, DNAME, Dname, MB, Mb, MD, Md, MF, Mf, MG, Mg, MR, Mr; DNS_MINFO_DATA MINFO, Minfo, RP, Rp; DNS_MX_DATA MX, Mx, AFSDB, Afsdb, RT, Rt; DNS_TXT_DATA HINFO, Hinfo, ISDN, Isdn, TXT, Txt, X25; DNS_NULL_DATA Null; DNS_WKS_DATA WKS, Wks; DNS_AAAA_DATA AAAA; DNS_KEY_DATA KEY, Key; DNS_SIG_DATA SIG, Sig; DNS_ATMA_DATA ATMA, Atma; DNS_NXT_DATA NXT, Nxt; DNS_SRV_DATA SRV, Srv; DNS_NAPTR_DATA NAPTR, Naptr; DNS_OPT_DATA OPT, Opt; DNS_DS_DATA DS, Ds; DNS_RRSIG_DATA RRSIG, Rrsig; DNS_NSEC_DATA NSEC, Nsec; DNS_DNSKEY_DATA DNSKEY, Dnskey; DNS_TKEY_DATA TKEY, Tkey; DNS_TSIG_DATA TSIG, Tsig; DNS_WINS_DATA WINS, Wins; DNS_WINSR_DATA WINSR, WinsR, NBSTAT, Nbstat; DNS_DHCID_DATA DHCID; } Data; } DNS_RECORD, *PDNS_RECORD;
msdn.microsoft.com(v=vs.85).aspx#namespaces Возникает вопрос, что мне нажать в программе, чтобы изменить win32 file namespace?
Наткнулся на такую штуку — Вот буквально сегодня накатал биндинги к DXGI. Накатал, надо сказать, очень быстро, буквально за пару часов.
А все почему? Макросы.
love5an.livejournal.com
Пользуясь случаем, напоминаю что OpenGL — говно.
Да, может OLE и протухло. Может, на чистом COM/OLE уже никто не пишет.
Но, чуваки, без интерфейса к COM на винде делать вообще нехуй. Совершенно.
Десктопные приложения, игрушки, или даже сервисы, без COM/OLE на винде не написать.
Любой язык, платформа или рантайм, который не принимает в расчет COM, у которого нет качественного интерфейса к этому — на винде нежизнеспособен и является как максимум академической игрушкой, а обычно же — студенческой поделкой.
love5an.livejournal.com
Дописал таки до приличного состояния привязку к GC.
У меня теперь весь COM — managed, да.
Продолжение про управление памятью и апартаментами COM в Doors: Дописал таки до приличного состояния привязку к GC.
У меня теперь весь COM — managed, да.
love5an.livejournal.com
Большой подробный пост, с картинками.
Как я в Doors управляю COM-апартаментами: Большой подробный пост, с картинками.
Очень интересно позволяет себя абьюзить:
img218.imageshack.us
синее там это окно.
Код:
pastebin.com
Обращаю внимание — Aero выключен. И мы там вообще не используем никакие виндовые средства для регуляции прозрачности.
Просто рисуем в HWND через Direct3D:
device->OMSetRenderTargets(1, &backBufferRTV, NULL);
FLOAT clearColor[4] = { 0.0f, 0.2f, 1.0f, 0.4f };
device->ClearRenderTargetView(backBufferRTV, clearColor);
swapChain->Present(0, 0);
Окно там обычное:
WS_POPUP // просто окошко, "без всего"
WS_EX_COMPOSITED // указание оконному менеджеру на то, что контролы в окне рисуются "bottom-to-top"(т.н. "алгоритмом художника"), по очереди
Тем не менее, у нас там не плотный синий квадрат, а вот такая прозрачная фиговина. Получается, мы рисуем прямо в текстуру, которую DWM использует для отображения окна.
А разгадка одна:
MARGINS m = {-1};
DwmExtendFrameIntoClientArea(hwnd, &m);
Но, я таки его одолел, и по этому случаю закоммитил в Doors: github.com
Теперь на CCL тоже можно писать COM-компоненты, и дергать COM-интерфейсы и даже целые COM-классы.
Еще я тестировал на clisp и SBCL, там тоже все хорошо работает.
Пример тут, например: github.com
Ясно видна сила MOP — класс hello-world-object является инстансом класса factory-class, а последний является инстансом и одновременно наследником com-class. А все три метаобъекта классов, и все их экземпляры, являются инстансами com-object.
com-обжекты можно дичайше круто передавать в чужой код, и чужой код, на каком-нибудь C++ или C#, будет дергать через виртуальные функции интерфейсов родные лисповые обобщенные фунцкции, которые мы писали на лиспе.
Метаклассы это вообще круто, они дичайше абстрагируют и очень сильно помогают писать меньше кода.