Здравствуйте! Я пытаюсь создать форму, которая позволяет пользователю щелкнуть в графическом окне, чтобы импортировать изображение в графическое окно среди других функций. Проблема заключается в импорте, один из членов моей команды сделал код для импорта, но мы не можем заставить его работать со смешанным управляемым и неуправляемым кодом. Никто из нас не знает ничего об управляемом коде или неуправляемом коде, входящем в этот проект, поэтому мы не знаем, как заставить работать следующее.
Ниже у нас есть два метода: один для преобразования WChar в строку, другой открывает окно браузера для выбора изображения. Последние используют класс рисунка, который содержит несколько переменных, таких как путь и имя. Класс рисунков работает в других функциях и не может быть изменен. Аналогичная версия GetLogo () работает, когда не в визуальной студии (без изменений).
#pragma unmanaged
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <iomanip>
using namespace std;
#pragma managed
#include "Picture.h"#include <list>
#using<system.dll>
using namespace System;
using namespace System::IO;
using namespace System::Collections::Generic;
static string importFiles = "Import Pictures";
static wstring importLogo = L"Import Logo";System::String^ convertWCharToString(wchar_t buffer[])
{
// Convert the wchar_t string to a char* string. Record
//.the length of the original string and add 1 to it to
//.account for the terminating null character.
size_t origsize = wcslen(buffer) + 1;
size_t convertedChars = 0;
// Allocate two bytes in the multibyte output string for every wide
// character in the input string (including a wide character
// null). Because a multibyte character can be one or two bytes,
// you should allot two bytes for each character. Having extra
// space for the new string is not an error, but having
// insufficient space is a potential security problem.
const size_t newsize = origsize*2;
// The new string will contain a converted copy of the original
// string plus the type of string appended to it.
char *nstring = new char[newsize];
// Put a copy of the converted string into nstring
wcstombs_s(&convertedChars, nstring, newsize, buffer, _TRUNCATE);String^ strBuf = gcnew System::String(nstring) ;
return strBuf;
}Picture^ GetLogo()
{
const int BUFSIZE = 1024;
wchar_t buffer[BUFSIZE] = {0};
//Define attributes of the OPEN FILE NAME
OPENFILENAME ofns = {0};
ofns.lStructSize = sizeof( ofns );
ofns.lpstrFile = buffer;
ofns.nMaxFile = BUFSIZE;
ofns.lpstrTitle = importLogo.c_str();
ofns.Flags = OFN_EXPLORER |
OFN_ENABLESIZING;
GetOpenFileName( & ofns );
wchar_t szFiles[1024], szFileTok[260];
wchar_t szDir[1024];
Picture^ file;
wchar_t *p;
lstrcpy(szFiles, buffer);
lstrcpy(szDir, buffer);
p = buffer;
p += lstrlen(p) + 1;
convertWCharToString(buffer);
String^ strBuf = gcnew System::String(buffer) ;
String^ strDir = gcnew System::String(szDir) ;
file = gcnew Picture(strBuf, strDir, false);
return file;
}
Picture.h
#pragma once
//This is used to hold the name of the picture, the path to it, and if it is picked in the viewer
#include <string>
ref class Picture
{
public:
Picture(){}; //default constructor
Picture(System::String^ newName, System::String^ newPath, bool newPicked)
{
strName = newName;
strPath = newPath;
boolPicked = newPicked;
}
void setName(System::String^ newName)
{
strName = newName;
}
void setPath(System::String^ newPath)
{
strPath = newPath;
}void setPicked(bool newPicked)
{
boolPicked = newPicked;
}
System::String^ getName()
{
return strName;
}
System::String^ getPath()
{
return strPath;
}
bool getPicked()
{
return boolPicked;
}
private:
System::String^ strName;
System::String^ strPath;
bool boolPicked;
};
#pragma endregion
Ниже приведен пример вызова функции getLogo
private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) {
Picture^ newLogo = GetLogo();
logoPictureBox->Image = dynamic_cast<Bitmap^> (Image::FromFile(newLogo->getPath(), true));
}
Ниже приведена текущая ошибка:
error LNK2028: unresolved token (0A000531) "extern "C" int __stdcall GetOpenFileNameW(struct tagOFNW *)" (?GetOpenFileNameW@@$$J14YGHPAUtagOFNW@@@Z) referenced in function "class Picture ^ __clrcall GetLogo(void)" (?GetLogo@@$$FYMP$AAVPicture@@XZ)
Если вам нужно больше кода, пожалуйста, дайте мне знать.
Спасибо за ваше время.
Задача ещё не решена.
Других решений пока нет …