C ++ GDI+ Текст рисования на прозрачном сложном окне

StackOverflow https://stackoverflow.com/questions/4783781

  •  24-10-2019
  •  | 
  •  

Вопрос

(Un -Managed C ++) Я уже преуспел в рисовании файлов PNG в прозрачное слоичное окно, которое я могу перетаскивать вокруг рабочего стола, но теперь моя проблема - рисовать текст в прозрачном сложном окне

Вот мой код и моя попытка рисовать текст в середине, важно отметить, что я использую Screendc вместо использования в сообщениях wm_paint

РЕДАКТИРОВАТЬ] Обновленный код после комментариев, теперь я просто пытаюсь написать текст на растровом карте, прежде чем получить версию HBITMAP, которую мне нужно использовать на этот раз, когда я использую шнурок, потому что Textout () не GDI+, я надеюсь. Действительно, GDI+ LOL все еще не работает, интересно, что я делаю не так

void Draw() // draws a frame on the layered window AND moves it based on x and y
{
    HDC screenDC( NULL ); // grab screen
    HDC sourceDC( CreateCompatibleDC(screenDC) );

    POINT pos = {x,y}; // drawing location
    POINT sourcePos = {0,0}; // top left of image
    SIZE size = {100,100}; // 100x100 image

    BLENDFUNCTION blendFunction = {0};
    HBITMAP bufferBitmap = {0};
    Bitmap* TheBitmap = crnimage; // crnimage was already loaded earlier

    // ------------important part goes here, my attempt at drawing text ------------//

 Gdiplus::Graphics     Gx(TheBitmap);

// Font* myFont =    new Font(sourceDC);
 Font myFont(L"Arial", 16);


 RectF therect;
 therect.Height = 20;
 therect.Width = 180;
 therect.X = 0;
 therect.Y = 0;

 StringFormat format;
 format.SetAlignment(StringAlignmentCenter);
 format.GenericDefault();
 Gdiplus::SolidBrush   GxTextBrush(Gdiplus::Color(255, 255, 0,255));


 WCHAR thetext[] = L"Sample Text";

 int stats = Gx.DrawString(thetext, -1, &myFont, therect, &format, &GxTextBrush);
 if(stats) // DrawString returns nonzero if there is an error
     msgbox(stats); 
 stats = Gx.DrawRectangle(&Pen(Color::Red, 3), therect);
 // the rectangle and text both draw fine now

 // ------------important part goes here, my attempt at drawing text ------------//

    TheBitmap->GetHBITMAP(0, &bufferBitmap);
    HBITMAP oldBmpSelInDC;
    oldBmpSelInDC = (HBITMAP)SelectObject(sourceDC, bufferBitmap);

    // some alpha blending
    blendFunction.BlendOp = AC_SRC_OVER;
    blendFunction.SourceConstantAlpha = wndalpha;
    blendFunction.AlphaFormat = AC_SRC_ALPHA;
    COLORREF colorKey( RGB(255,0,255) );
    DWORD flags( ULW_ALPHA);

    UpdateLayeredWindow(hWnd, screenDC, &pos, & size, sourceDC, &sourcePos,
    colorKey, &blendFunction, flags);

    // release buffered image from memory
    SelectObject(sourceDC, oldBmpSelInDC);
    DeleteDC(sourceDC);
    DeleteObject(bufferBitmap); 

    // finally release the screen
    ReleaseDC(0, screenDC);
}

Я пытался написать текст в своем слоистом окне уже два дня, но из тех попыток я знаю, что есть несколько способов сделать это (к сожалению, я понятия не имею, как именно)

Обычный вариант, который я вижу, - это рисовать текст на растровом карте, а затем сама растровая карта

  1. Используйте GDI+ для загрузки растрового изображения
  2. Создайте графический объект из растрового карты
  3. Используйте шнурки, чтобы записать текст в растровый карту
  4. Утилизировать графический объект
  5. Используйте метод сохранения растрового изображения, чтобы сохранить результат в файле

Видимо, можно также сделать графический объект из DC, затем нарисовать текст на DC, но я снова понятия не имею, как это сделать

Это было полезно?

Решение

Общий подход выглядит правильно, но я думаю, что у вас есть проблемы с DrawString вызов. Проверьте документацию (особенно образец) на MSDN.

Gx.DrawString(thetext, 4, NULL, therect, NULL,  NULL)

Вероятно, необходимо указать третий, пятый и шестой параметры (шрифт, формат и кисть). В документации не говорится, что они необязательны. Прохождение NULL Ибо это, вероятно, заставляет GDI+ рассматривать вызов как нето.

Второй параметр не должен включать завершающееся L ' 0' в строке. Вероятно, это лучше всего использовать -1, если ваша строка всегда прекращается.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top