mabu
winapi freebasic Чтобы рисовать «в памяти», нужен контекст устройства в памяти. Создать его можно через CreateCompatibleDC. Однако проблема в таком устройстве в том, что по умолчанию в нём выбран чёрно‐белый BITMAP размером 1 на 1 пиксель. Поэтому рисунок в контексте устройства в памяти будет чёрно‐белым. Чтобы рисунок был цветным, необходимо создать BITMAP на основе оконного или дисплейного контекста устройства и выбрать его в контекст устройства в памяти:

```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 и создавать новый по новому размеру клиентской области.
mabu
winapi Как рисовать в окне с двойной буферизацией:

Регистрируя класс окна, в структуре WNDCLASS устанавливаем hbrBackground = NULL.
В WM_CREATE создаём BITMAP.
В этом BITMAP рисуем при любых изменениях сцены и вызываем функцию InvalidateRect(hwnd, lpRect, FALSE) или InvalidateRgn(hwnd, lpRegion, FALSE).
В обработчике WM_PAINT копируем участки из BITMAP в hDC окна через BitBlt, не стирая содержимого окна.
В обработчике WM_ERASEBKGND просто возвращаем TRUE — это сигнал системе, что мы стёрли фон.
mabu
winapi Общее количество доступных объектов GDI варьируется от одной версии Windows к другой: Windows 95, 98 и Millennium имеют ограничение в 1200 объектов; Windows 2000 имеет ограничение в 16 384 объекта; а Windows XP, Vista и Windows 7 имеют настраиваемое ограничение через реестр, которое по умолчанию составляет 10000 объектов на процесс (но теоретический максимум 65 536 для всего сеанса).
mabu
Windows winapi freebasic Сделал программу. Она получает список доступных разрешений монитора, переключает разрешение и создаёт выскакивающее полноэкранное окно.
Для полноэкранного окна ведь достаточно стиля WS_POPUP? Или нужно что‐то ещё?
github.com
Добавить нескучную анимацию, что ли.
OCTAGRAM
работа winapi com Автозавершение в текстовых элементах Windows
Так и не нашёл нормальный способ вручную пинать это автозавершение, чтоб оно список перечитывало и чтоб возможные варианты принудительно показывало. Возможные варианты, пока текст не набран, отсутствуют, а даже после того, как набран, нужно получить ответ по HTTP, и только тогда есть, что показать. Объект автозавершения читает пустой список и запоминает, а когда можно что-то показать, список для автозаполнения всё равно пустой. Пока остановился на варианте с RecreateWnd + SendMessage(WM_KEYDOWN, VK_DOWN).

Изолентой там всё скручено. Тут оконные ручки и оконные функции, а тут COM-интерфейсы, а как что-то надо, так и пнуть нечего. Ни сообщение нормальное послать, ни метод интерфейса вызвать.
d1mk0
Windows быдлокодинг winapi хочу разработать файловый менеджер для венды, суть такова:
написано на си с вызовами WinAPI (компилятор TCC), малый размер, мгновенный запуск, охренительная скорость, объединён с удобной консолью (возможности cmd + свои команды).

интерфейс навигации по папкам самый примитивный, ч/б, самописный
консоль красивая, цветная

также хотелось бы написать свою оболочку для программиста (замену explorer.exe): фичи те же (скорость, малый размер) + настраиваемость ВСЕХ горячих клавиш, поддержка нескольких рабочих столов. неперекрывающийся оконный менеджер (по типу awesome, subtle, i3 и xmonad в linux)

всё, что есть, оно какое-то тормозное и перегруженное
k0st1x
открытие winapi для меня стало открытием, что windows для генерации уникальных идентификаторов (guid'ов) делает remote procedure call на сервер, который гарантированно вернет идентификатор уникальный для локальной подсети.
lovesan
Windows programming C winapi Написал тут недавно — библиотека-звонилка для винды. Обертка над RAS API, пока что может просто поднимать соединение по имени, закрывать, и сообщать о том, существует ли оно уже. Для VPN, диалапа, и пр.

Может кому надо:
github.com
folex
Windows winapi OHMYGOD from /dev/windows/private/security/msv_sspi/kernel/krnlapi.cxx :
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

--*/
borman
? Windows programming winapi Жуйк, а что рекомендуешь почитать коротенького как введение в винапи (желательно, в современном состоянии), чтобы получить общее представление?
AKa
code говно winapi блевать безудержно
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;
k0st1x
winapi блин, в винде столько говна )) только что узнал, что в стандартный winapi входит функционал разпознавания образов для логина в систему "Windows Biometric Framework"
Dudraug
? кодинг winapi Жуйк, подскажи как создать через винапи битмап из файла, структуру. Мне нужен указатель на какой-то битмап, походу винапишный... Не спрашивай, чужой быдло код, потому я даже не уверен что мне надо.
lovesan
Windows Lisp programming winapi com Рационализация моей работы с COM. Необходимая, наверное, вещь, раз тут один долбоеб уже заикнулся об этом.

Да, может OLE и протухло. Может, на чистом COM/OLE уже никто не пишет.
Но, чуваки, без интерфейса к COM на винде делать вообще нехуй. Совершенно.
Десктопные приложения, игрушки, или даже сервисы, без COM/OLE на винде не написать.

Любой язык, платформа или рантайм, который не принимает в расчет COM, у которого нет качественного интерфейса к этому — на винде нежизнеспособен и является как максимум академической игрушкой, а обычно же — студенческой поделкой.
lovesan
Windows winapi dierct3d Все-таки, DWM очень интересно устроен.
Очень интересно позволяет себя абьюзить:

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);
zhu
говно winapi не понимаю, почему виндовые программеры менее ценны, чем линуксовые. бля, ребята, да за то, что чувак разобрался с WinApi, запомнил все говнонюансы типа функций (не помню дословно) ChangeServiceParam() и ChangeServiceParam2(), или умеет работать с шикарными говнотипами типа LPWTSTR, — ему памятник поставить нужно. Полное отсутствие линуксовой логики, стройности и скромности реализации. Это ж зубриловка сплошная. Буэээээээ.
lovesan
Windows Lisp winapi com doors Полтора месяца я ебался с кривым Clozure CL, который поддерживает метаобъектный протокол CLOS через задницу, и то кое-как.

Но, я таки его одолел, и по этому случаю закоммитил в Doors: github.com
Теперь на CCL тоже можно писать COM-компоненты, и дергать COM-интерфейсы и даже целые COM-классы.
Еще я тестировал на clisp и SBCL, там тоже все хорошо работает.

Пример тут, например: github.com
Ясно видна сила MOP — класс hello-world-object является инстансом класса factory-class, а последний является инстансом и одновременно наследником com-class. А все три метаобъекта классов, и все их экземпляры, являются инстансами com-object.
com-обжекты можно дичайше круто передавать в чужой код, и чужой код, на каком-нибудь C++ или C#, будет дергать через виртуальные функции интерфейсов родные лисповые обобщенные фунцкции, которые мы писали на лиспе.

Метаклассы это вообще круто, они дичайше абстрагируют и очень сильно помогают писать меньше кода.