Используйте HBITMAP в dll (Logitech SDK)

Я пишу плагин для музыкального проигрывателя под названием MusicBee. Плагин для клавиатуры Logitech G LCD. Для клавиатур Logitech G19 я добавлю хороший фон из растрового файла.
SDK говорит, что я должен использовать HBITMAP для создания фона. Теперь я использую HBITMAP, а фон не отображается. Это код для фона и логотипа на главной странице плагина.

m_lcd.ModifyDisplay(LG_COLOR);
background =(HBITMAP) LoadImage( NULL, L"Logitech/G19logo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_lcd.SetBackground(background);
logo = m_lcd.AddText(LG_STATIC_TEXT, LG_BIG, DT_CENTER, LGLCD_QVGA_BMP_WIDTH);
m_lcd.SetOrigin(logo, 0, 50);
m_lcd.SetText(logo, _T("MusicBee"));
m_lcd.SetTextFontColor(logo, RGB(0,0,0));
m_lcd.Update();

Полный код моего класса Logitech:

//-----------------------------------------------------------------
// Logitech File
// C++ Source - Logitech.cpp - version 2012 v1.0
//-----------------------------------------------------------------

//-----------------------------------------------------------------
// Include Files
//-----------------------------------------------------------------
#include "stdafx.h"#include "Logitech.h"
//-----------------------------------------------------------------
// Logitech methods
//-----------------------------------------------------------------//This LogitechObject is a instance of the Logitech class for using in the thread
Logitech * Logitech::LogitechObject;

Logitech::Logitech():   stopthread(false), firstTime(true), position(0), duration(0)
{
LogitechObject = this;
}

Logitech::~Logitech()
{
stopthread = true;
this->state = StatePlay::Undefined;
timerThread.detach();
}

void CALLBACK Logitech::TimerProc(void* lpParameter, BOOLEAN TimerOrWaitFired)
{
if(LogitechObject->m_lcd.ButtonTriggered(LG_BUTTON_4))
{
LogitechObject->time = 0;
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, static_cast<FLOAT>(100));
LogitechObject->m_lcd.Update();
}
}

bool Logitech::getFirstTime()
{
return firstTime;
}

//Initialise Logitech LCD
BOOL Logitech::OnInitDialog()
{
HRESULT hRes = m_lcd.Initialize(_T("MusicBee"), LG_DUAL_MODE, FALSE, TRUE);

if (hRes != S_OK)
{
return FALSE;
}

m_lcd.SetAsForeground(true);

//Create home screen Logitech Color LCD
if(m_lcd.IsDeviceAvailable(LG_COLOR))
{
m_lcd.ModifyDisplay(LG_COLOR);
//m_lcd.SetBackground(RGB(245,245,245));
background =(HBITMAP) LoadImage( NULL, L"Logitech/G19logo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_lcd.SetBackground(background);
logo = m_lcd.AddText(LG_STATIC_TEXT, LG_BIG, DT_CENTER, LGLCD_QVGA_BMP_WIDTH);
m_lcd.SetOrigin(logo, 0, 50);
m_lcd.SetText(logo, _T("MusicBee"));
m_lcd.SetTextFontColor(logo, RGB(0,0,0));
m_lcd.Update();
}

//Create home screen Logitech Monochrome LCD
else if(m_lcd.IsDeviceAvailable(LG_MONOCHROME))
{
m_lcd.ModifyDisplay(LG_MONOCHROME);
logo = m_lcd.AddText(LG_STATIC_TEXT, LG_BIG, DT_CENTER, LGLCD_BW_BMP_WIDTH);
m_lcd.SetOrigin(logo, 0, 5);
m_lcd.SetText(logo, _T("MusicBee"));
m_lcd.Update();
}

//Start thread
timerThread = thread(&Logitech::startThread);

//CreateTimerQueueTimer(NULL,NULL,&Logitech::TimerProc,this,0,1250,WT_EXECUTEDEFAULT);

return TRUE;  // return TRUE  unless you set the focus to a control
}

//Create playing screen for Logitech Monochrome LCD
VOID Logitech::createMonochrome()
{
m_lcd.RemovePage(0);
m_lcd.AddNewPage();
m_lcd.ShowPage(0);

if (logo != 0)
{
delete logo;
logo = 0;
}

artist = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_BW_BMP_WIDTH);
m_lcd.SetOrigin(artist, 0, 0);

title = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_BW_BMP_WIDTH);
m_lcd.SetOrigin(title, 0, 13);

progressbar = m_lcd.AddProgressBar(LG_FILLED);
m_lcd.SetProgressBarSize(progressbar, 136, 5);
m_lcd.SetOrigin(progressbar, 12, 38);

time = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80);
m_lcd.SetOrigin(time, 12, 29);

time1 = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80);
m_lcd.SetOrigin(time1, 125, 29);

/*      playIcon = static_cast<HICON>(LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_PNG2), IMAGE_BITMAP, 16, 16, LR_MONOCHROME));
playIconHandle = m_lcd.AddIcon(playIcon, 16, 16);
m_lcd.SetOrigin(playIconHandle, 2, 29);*/

firstTime = false;
changeArtistTitle(this->artistString, this->albumString, this->titleString, this->duration, this->position);
}

//Create playing screen for Logitech Color LCD
VOID Logitech::createColor()
{
m_lcd.RemovePage(0);
m_lcd.AddNewPage();
m_lcd.ShowPage(0);

if (logo != 0)
{
delete logo;
logo = 0;
}

//background.LoadFromResource(NULL, AfxGetInstanceHandle(), IDB_BITMAP2, _T("BMP"));
background =(HBITMAP) LoadImage( NULL, L"Logitech/G19Background.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

//HBITMAP bmpBkg_ = background.GetHBITMAP();
m_lcd.SetBackground(background);

//m_lcd.SetBackground(RGB(184,220,240));

artist = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_QVGA_BMP_WIDTH);
m_lcd.SetOrigin(artist, 5, 5);
m_lcd.SetTextFontColor(artist, RGB(0,0,0));

album = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_QVGA_BMP_WIDTH);
m_lcd.SetOrigin(album, 5, 30);
m_lcd.SetTextFontColor(album, RGB(0,0,0));

title = m_lcd.AddText(LG_SCROLLING_TEXT, LG_MEDIUM, DT_CENTER, LGLCD_QVGA_BMP_WIDTH);
m_lcd.SetOrigin(title, 5, 55);
m_lcd.SetTextFontColor(title, RGB(0,0,0));

time = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 80);
m_lcd.SetOrigin(time, 5, 80);
m_lcd.SetTextFontColor(time, RGB(0,0,0));

time1 = m_lcd.AddText(LG_STATIC_TEXT, LG_SMALL, DT_LEFT, 40);
m_lcd.SetOrigin(time1, 275, 80);
m_lcd.SetTextFontColor(time1, RGB(0,0,0));

progressbar = m_lcd.AddProgressBar(LG_FILLED);//320�240 pixel color screen
m_lcd.SetProgressBarSize(progressbar, 310, 20);
m_lcd.SetProgressBarColors(progressbar, RGB(25,71,94),NULL);
m_lcd.SetOrigin(progressbar, 5, 100);

/*playIcon = static_cast<HICON>(LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_PNG1), IMAGE_ICON, 16, 16, LR_COLOR));
playIconHandle = m_lcd.AddIcon(playIcon, 16, 16);
m_lcd.SetOrigin(playIconHandle, 5, 29);*/

firstTime = false;
changeArtistTitle(this->artistString, this->albumString, this->titleString, this->duration, this->position);
}

void Logitech::startThread()
{
while(!LogitechObject->stopthread)
{
this_thread::sleep_for( chrono::milliseconds(500) );

if(!LogitechObject->stopthread && LogitechObject->progressbar != NULL)
{
//Update progressbar and position time on the screen after 1 second of music.
if(LogitechObject->state == StatePlay::Playing)
{
this_thread::sleep_for( chrono::milliseconds(500) );
LogitechObject->position++;
float progresstime = ((float)LogitechObject->position / (float)LogitechObject->duration)*100;
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, static_cast<FLOAT>(progresstime));
LogitechObject->m_lcd.SetText(LogitechObject->time, LogitechObject->getTimeString(LogitechObject->position).c_str());
}

//If music stopped then the progressbar and time must stop immediately
else if(LogitechObject->state == StatePlay::Stopped)
{
LogitechObject->position = 0;
LogitechObject->m_lcd.SetProgressBarPosition(LogitechObject->progressbar, 0);
LogitechObject->m_lcd.SetText(LogitechObject->time, LogitechObject->getTimeString(LogitechObject->position).c_str());
}

LogitechObject->m_lcd.Update();
}
}
}

void Logitech::changeArtistTitle(wstring artistStr, wstring albumStr, wstring titleStr, int duration, int position)
{
this->artistString = artistStr;
this->albumString = albumStr;
this->titleString = titleStr;
this->durationString = getTimeString(duration/1000);
this->position = position;
this->duration = duration/1000;

if(!firstTime)
{
if(m_lcd.IsDeviceAvailable(LG_COLOR))
{
m_lcd.SetText(album, albumStr.c_str());
}m_lcd.SetText(artist, artistStr.c_str());
m_lcd.SetText(title, titleStr.c_str());
m_lcd.SetText(time, getTimeString(position).c_str());

string s( durationString.begin(), durationString.end() );

if(s.size() < 5)
{
s = "0" + s;
}

wstring ws( s.begin(), s.end() );

m_lcd.SetText(time1, ws.c_str());
ws.clear();

///*playIcon = static_cast<HICON>(LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_PNG1), IMAGE_ICON, 16, 16, LR_COLOR));
//playIconHandle = m_lcd.AddIcon(playIcon, 16, 16);
//m_lcd.SetOrigin(playIconHandle, 5, 29);*/

m_lcd.Update();

artistStr.clear();
albumStr.clear();
titleStr.clear();

}
}

//Set current playing position
void Logitech::setPosition(int pos)
{
this->position = pos/1000;
m_lcd.SetText(time, getTimeString(this->position).c_str());
m_lcd.Update();
}

void Logitech::setDuration(int duration)
{
this->duration = duration/1000;
m_lcd.SetText(time1, getTimeString(this->duration).c_str());
m_lcd.Update();
}

//Change play state of the current playing song
void Logitech::changeState(StatePlay state)
{
this->state = state;

if(state == StatePlay::Playing && firstTime)
{
if(m_lcd.IsDeviceAvailable(LG_COLOR))
{
createColor();
}

else if(m_lcd.IsDeviceAvailable(LG_MONOCHROME))
{
createMonochrome();
}
}
}//Change int of time to string
wstring Logitech::getTimeString(int time)
{
string minutes = to_string((int)time /60);
string seconds = to_string((int)time%60);

if(minutes.size() < 2)
{
minutes = "0" + minutes;
}

if(seconds.size() < 2)
{
seconds = "0" + seconds;
}

string timeString = minutes + ":" + seconds;

return wstring( timeString.begin(), timeString.end() );
}

В чем проблема, которую показывает фоновый nog?

0

Решение

Из вашего ответа в комментариях кажется, что проблема в вызове LoadImage, поэтому мы можем пока игнорировать остальную часть кода. Вызов GetLastError сразу после сбоя вызова LoadImage и посмотреть, что он возвращает.

Только несколько вещей могут пойти не так с вызовом LoadImage:

  • Возможно, вы неправильно указали имя файла. (GetLastError вернет ERROR_FILE_NOT_FOUND)
  • Вы используете относительный путь, но, возможно, текущий рабочий каталог не там, где вы думаете. (GetLastError вернет ERROR_FILE_NOT_FOUND или ERROR_PATH_NOT_FOUND.)
  • Может быть, этот API не работает с косой чертой вместо обратной косой черты.
  • Может быть, у вас нет доступа для чтения файла. (GetLastError вернет ERROR_ACCESS_DENIED или ERROR_NETWORK_ACCESS_DENIED.)
  • Возможно, в другом приложении файл открыт без общего доступа. (GetLastError вернет ERROR_SHARING_VIOLATION.)
  • Возможно, файл не является допустимым растровым изображением. (Я не уверен, что GetLastError вернет сюда. Возможно, что-то вроде ERROR_INVALID_PARAMETER.)
  • Может быть, это гигантское растровое изображение и недостаточно памяти для его загрузки. (GetLastError вернет ERROR_NOT_ENOUGH_MEMORY.)

В общем, при отладке выделите точку в коде, где все идет не так (как только вы узнаете, что LoadImage дал сбой, вы можете перестать беспокоиться обо всем коде, который происходит после этого). Затем получите как можно больше информации (например, если произошел сбой вызова API Windows, вызовите GetLastError и перечитайте всю страницу MSDN для этого API, используйте отладчик для проверки относительного состояния в этой точке). Оттуда, как правило, будет довольно очевидно, что делать. Если нет, напишите простейшую программу, которая может выполнить тот же шаг. Если это работает, изучите различия между вашим простым примером и вашим реальным кодом.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]