Массив монохромных битов

Ganster 89

Всем привет! Чего то я не допонял видимо ! У меня не получается вывести нужный мне массив в рабочей области окна! Что я не так делаю, уже много раз не получалось ! Просветите пожалуйста буду очень благодарен!
#include <windows.h>
#include <math.h>
#include <tchar.h>
#include <string>
 
 BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
HINSTANCE hInstance;
TCHAR szClass[] = L"HelloWin";
 
HWND edit; 
 
 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
    MSG msg;
    HWND hwnd;
    hInstance = hInst;
    if (!RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE;
    hwnd = CreateWindow(szClass, L"The Hello Program",  WS_OVERLAPPEDWINDOW | WS_VISIBLE |   SBS_VERT,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance,   NULL);
    if (!hwnd) return FALSE;
    
    ShowWindow(hwnd, nCmdShow );
    
    
    UpdateWindow(hwnd);       //Дескриптор обновляемого окна
    
 
    while(GetMessage(&msg, NULL, 0, 0))
    { 
        TranslateMessage(&msg); DispatchMessage(&msg); 
    }
    return msg.wParam;
 
}
 
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
    WNDCLASS wc;
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0;
    wc.lpfnWndProc = Proc;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szName;
    return (RegisterClass(&wc) != 0);
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
  static int cxClient, cyClient;
  RECT rc;
  PAINTSTRUCT ps;
  HBITMAP hbm, hbm2,  ;
  HDC hMemDC, hdc ;
  BITMAP bm = {0};
  TCHAR tchar1[1024], tchar2[1024], tchar3[1024], tchar4[1024], tchar5;   
  BYTE bBytes[] =
{
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
 
};
      switch(iMsg)
 {
 case WM_SIZE:
    cxClient = LOWORD(lParam);
    cyClient = HIWORD(lParam);
 
     break;
 
 case WM_CREATE:
     bm.bmType = 0;
     bm.bmWidth = 20;
     bm.bmHeight = 5;
     bm.bmWidthBytes = 8;
     bm.bmPlanes = 1;
     bm.bmBitsPixel = 1;
     bm.bmBits = bBytes;
 
    break;
 case WM_PAINT:
    
     hdc = BeginPaint(hwnd,&ps);
    
         GetClientRect(hwnd,&rc);
     
     hMemDC = CreateCompatibleDC(hdc);
     
    if(!hMemDC)
    {
        DWORD errCode1 = GetLastError();
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |     FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, errCode1, 0, tchar1, sizeof(tchar1), NULL);
        MessageBox(hwnd, tchar1, L"Error!", MB_OK);
    }
 
     hbm = CreateBitmap(96,12,1,1,bBytes);
    
    hbm2 = (HBITMAP)SelectObject(hMemDC,hbm);
    
    if(!hbm2)
    {
        DWORD errCode2 = GetLastError();
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |    FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, errCode2, 0, tchar2, sizeof(tchar2), NULL);
        MessageBox(hwnd, tchar3, L"Error!", MB_OK);
    }
    
     BitBlt(hdc,0,0, 96,12,hMemDC,0,0,SRCCOPY);
 
     DeleteObject(hdc);
     DeleteDC(hMemDC);
     DeleteObject(hbm);
     DeleteObject(hbm2);
    
     EndPaint(hwnd, &ps); 
    break;
 
 case WM_DESTROY:
 
 PostQuitMessage(0);
 return 0;
 }
 return DefWindowProc(hwnd, iMsg, wParam, lParam);
 }
4 ответа

Ganster 89

У меня не получается вывести нужный мне массив в рабочей области окна
Ganster 89, а какой вам нужен? Сформулируйте вопрос конкретнее что вам не ясно.


Ganster 89

Ок, Описание переменной массива Bbytes, в которой хотел сохранить вид битов чёрных и белых ! Чтобы они отображались на экране как полосы 0x00 чёрная полоса, 0хff белая полоса ну потом 2 чёрных одна белая и.т.д ! первые две строки правильно выводит потом всё искажает вниз тянет !


Ganster 89

Ganster 89, как видно из массива bBytes, 1 строка должна содержать 8 байт = 64 бита. Всего строк 12. соответственно битмап нужно построить следующим форматом:
CreateBitmap(64, 12, 1, 1, bBytes);


Ganster 89

jonson, Блин ну ты красавчик! Спасибо большое !