Я новичок в MFC и пытаюсь изучить его с помощью проекта диалоговой базы MFC на VS2008. Вот архивы, которые я сделал:
Во-первых, мне удалось отобразить список изображений из папки в элемент управления Listbox. После этого я также обработал событие щелчка в каждой строке списка, чтобы загрузить и показать изображение в Picture Control (тип Bitmap) с правой стороны. Вы можете увидеть изображение ниже для простоты понимания: Пожалуйста, нажмите здесь, чтобы увидеть изображение моего диалогового окна MFC
Вот код. Обратите внимание, что m_ListCtrl
и static_picture
— это переменные списка и элемента управления изображением:
void CMyClientDlg::OnLbnSelchangeList1(){
CString imagePath;
m_ListCtrl.GetText(m_ListCtrl.GetCurSel(),imagePath);
CImage picture;
picture.Load(imagePath);
if (!picture.IsNull())
{
float screenWidth = 200, screenHeight = 200;
float imageWidth = picture.GetWidth();
float imageHeight = picture.GetHeight();
//scaling:
float pictureRatio = imageWidth/ imageHeight;
float newImageWidth;
float newImageHeight;
int aligmentX = 0;
int aligmentY = 0;
if (pictureRatio <= 1)
{
newImageWidth = imageWidth*(screenHeight/imageHeight);
newImageHeight = screenHeight;
aligmentX = (screenWidth-newImageWidth)/2;
}
else
{
newImageWidth = screenWidth;
newImageHeight = imageHeight*(screenWidth/imageWidth);
aligmentY = (screenHeight - newImageHeight)/2;
}
//end scaling.
CDC *screenDC = GetDC();
CDC mDC;
mDC.CreateCompatibleDC(screenDC);
CBitmap bitMap;
bitMap.CreateCompatibleBitmap(screenDC, screenWidth, screenHeight);
CBitmap *pob = mDC.SelectObject(&bitMap);
mDC.SetStretchBltMode(HALFTONE);
picture.StretchBlt(mDC.m_hDC, aligmentX, aligmentY, newImageWidth, newImageHeight, 0, 0, imageWidth, imageHeight, SRCCOPY);
mDC.SelectObject(pob);
/*.......code to convert bitmap to BYTE* ........*/
/*.......code to send BYTE* over socket........*/
//display the bit map
static_picture.SetBitmap((HBITMAP)bitMap.Detach());
//clean up
ReleaseDC(screenDC);
}
}
Итак, теперь я хотел бы сделать еще один шаг и попытался работать с сокетом... и да, я успешно отправил и получил простой char* или CString через сокет.
Что я хочу сделать, так это: вместо отображения изображения в этом диалоговом окне оно показывает изображение в другом диалоговом окне (сервере).
Как-то я узнал, что есть 2 звуковые функции: SetBitmapBits()
и GetBitmapBits()
(честно говоря, я только что прочитал это в каком-то источнике и понятия не имел, подходят ли они для моей цели здесь).
Итак, я добавил этот фрагмент кода, чтобы превратить приведенное выше растровое изображение в массив BYTE bmpBuffer
:
BITMAP bmpProperties;
bitMap.GetBitmap(&bmpProperties);
int bmpDemension = bmpProperties.bmWidthBytes*bmpProperties.bmHeight;
BYTE* bmpBuffer=(BYTE*)GlobalAlloc(GPTR, bmpDemension);
bitMap.GetBitmapBits(bmpDemension,bmpBuffer);
Затем отправьте этот массив через сокет:
UpdateData(TRUE);
char *socketBuffer = reinterpret_cast<char*>(bmpBuffer);
send(m_ClientSocket, socketBuffer, sizeof(socketBuffer), 0);
//clean up after send
GlobalFree((HGLOBAL)bmpBuffer);
В другом диалоге. Примечание. Я жестко запрограммировал размер растрового изображения на 160000, просто чтобы упростить проблему:
void CMyServer2Dlg::OnReceive(){
char *socketBuffer = new char [1025];
int iLen;
iLen = recv(m_sConnected, socketBuffer, 1025, NULL);
if(iLen==SOCKET_ERROR)
{
AfxMessageBox("Could not Receive");
}
else
{
BYTE* bmpBuffer = reinterpret_cast<BYTE*>(socketBuffer);
//re-construct the bitmap
CBitmap clone;
CDC *screenDC = GetDC();
CDC mDC;
mDC.CreateCompatibleDC(screenDC);
clone.CreateCompatibleBitmap(screenDC, 200, 200);
clone.SetBitmapBits(160000,bmpBuffer);
//Picture control(type bitmap) has variable "static_picture"
static_picture.SetBitmap((HBITMAP)clone.Detach());
UpdateData(FALSE);
ReleaseDC(screenDC);
GlobalFree((HGLOBAL)bmpBuffer);
}
delete socketBuffer;
И это просто не работает... Скажите, пожалуйста, где я накосячил? И извините за длинный пост.....
sizeof(bmpBuffer)
на стороне отправителя он показывает только 4 байта. А поскольку тип данных BYTE — это не что иное, как беззнаковый символ, я думаю, что буфер приема 1025 достаточно велик? - person Trung Nguyen   schedule 04.05.2016