• ベストアンサー

GDI+について

Jpegファイルを保存したくて、 GDI+(gdiplus.dll)のことを知りました。 gdiplus.hをインクルードして、使ってみました。 GDI+は、、、.NETに似ている気がします。 これは、便利ですが、 安易にこれを使ってもいいのでしょうか? なんというか、 マネージドアプリケーションになるような気がするのですが。 なるのでしょうか?ならないのでしょうか? Visual Studio.NET WindowsXP よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

C++で使っているのでしたらアンマネージドです。 .NET Frameworkでの描画はGDI+を経由していますので、.NET Frameworkを使えばマネージドでGDI+を使って描画していることになります。

thulala
質問者

お礼

ありがとうございました。

関連するQ&A

  • gdi+ LNK1103

    Windows2000、VC++6.0 mfc こんにちは。 gdi+を使ってJPEG 画像を保存しようと思ったらリンクエラーになってしまいました。以下状況です。 Platform SDKをダウンロードし、INCLUDEおよびLIBのパスをオプション-ディレクトリタ-インクルードファイル、ライブラリファイルに追加して最上位に移動しました。gdiplus.dllをダウンロードし、exeと同じフォルダに置きました。 StdAfx.h  #pragma comment(lib, "GdiPlus.lib")  #include <gdiplus.h>  using namespace Gdiplus; CxxxApp.h private: ULONG_PTR m_gdiplusToken; CxxxApp.cpp   BOOL CHogeApp::InitInstance(){    Gdiplus::GdiplusStartupInput gdiplusStartupInput;    Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);    … } void CxxxApp::OnPicture() {  CLSID encoderClsid;  GetEncoderClsid(L"image/jpeg", &encoderClsid);  LONG lQuality = 80;  EncoderParameters EncoderParams;  EncoderParams.Parameter[0].Guid = EncoderQuality;//------☆  EncoderParams.Parameter[0].NumberOfValues = 1;  EncoderParams.Parameter[0].Type = EncoderParameterValueTypeLong;  EncoderParams.Parameter[0].Value = (VOID*) &lQuality;  EncoderParams.Count = 1; … } この状態でビルドすると、 GdiPlus.lib(imagingguds.obj) : fatal error LNK1103: デバッグ情報が壊れています; モジュールを再コンパイルしてください というメッセージが出ます。どうやら☆の行で出ているようなのですが、どうしていいのか分かりません。ちなみにこれはデバッグバージョンでのみ出現し、リリースバージョンでは何のエラーも出ません。 何か間違い、足りないものがあればご指摘ください。 お願いします。

  • gdiplus.dllを使わないプログラム開発

    はじめまして、 ”Microsoft Visual C++ 2008”にてダイアログベースのプログラムを書いています。 windows2000に対応するために、gdiplus.dllを使用しないプログラムを作成したいのですが、 新規作成したプロジェクトをそのままビルドしただけでもgdiplus.dllが読込まれてしまいます。 読込まなくするには、どのように設定を行なえばよいのでしょうか。 それとも”Visual C++ 2008”ではgdiplus.dllを使用しないダイアログベースのプログラム開発は不可能なのでしょうか。 動作対象OS:win2000(SPなし)以降 開発環境: 言語:Visual C++ 2008(visual studio 2008 professional edition) テンプレート:MFCアプリケーション アプリケーションの種類:ダイアログベース 以上、よろしくお願いいたします。

  • GDI+で画像表示後に画面がちらつく

    GDI+を使いクライアント領域に画像を表示後に、ウィンドウサイズを変更すると変更中に画面が激しくちらつきます。本に書いてあったバックバッファを使った方法も試したのですが変わりませんでした。 どうすればちらつかないようにできますか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C++ #include <windows.h> #include <GdiPlus.h> #pragma comment(lib,"gdiplus.lib") LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); TCHAR szClassName[] = TEXT("test"); Gdiplus::Bitmap *img1=NULL; Gdiplus::Bitmap *backbuf=NULL; int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { MSG msg; BOOL bRet; Gdiplus::GdiplusStartupInput gdisi; ULONG_PTR gditoken; if(Gdiplus::GdiplusStartup(&gditoken,&gdisi,NULL)!= Gdiplus::Ok) return 0; if (!InitApp(hCurInst)) return FALSE; if (!InitInstance(hCurInst, nCmdShow)) return FALSE; while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } delete img1,backbuf; Gdiplus::GdiplusShutdown(gditoken); return (int)msg.wParam; } ATOM InitApp(HINSTANCE hInst) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = (LPCTSTR)szClassName; wc.hIconSm = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); return (RegisterClassEx(&wc)); } BOOL InitInstance(HINSTANCE hInst, int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szClassName, TEXT("GDI+で画像表示"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { PAINTSTRUCT ps; HDC hdc; static int imgwidth; static int imgheight; switch (msg) { case WM_CREATE:{ img1=new Gdiplus::Bitmap(TEXT("test.jpg")); if(img1->GetLastStatus() != Gdiplus::Ok){ MessageBox(hWnd,TEXT("ファイルがありません"),NULL,MB_OK); } imgwidth=img1->GetWidth(); imgheight=img1->GetHeight(); backbuf=new Gdiplus::Bitmap(imgwidth,imgheight,PixelFormat32bppARGB); Gdiplus::Graphics g(backbuf); g.DrawImage(img1,0,0,imgwidth,imgheight); break;} case WM_PAINT:{ hdc=BeginPaint(hWnd,&ps); Gdiplus::Graphics g(hdc); g.DrawImage(backbuf,0,0,imgwidth,imgheight); EndPaint(hWnd,&ps); break;} case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

  • C2146を回避するにはどうしたら良いのでしょうか

    いつもここにお世話になってますm(__)m。今回は下記の様なエラーが出てしまい、困っております(--;)。 <エラー内容> 1>C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(222) : error C2146: 構文エラー : ';' が、識別子 'PVOID64' の前に必要です。 1>C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(222) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません エラーが起こっているのはwinnt.h内の「typedef void * POINTER_64 PVOID64;」という部分なのですが(他にもありますが)、winnt.hは弄ってないのです。 ネットで検索したところインクルードファイルディレクトリの指定の順番が怪しそうなので、「ツール」「オプション」でPlatformSDK関連が一番上に来るように変更(実行可能ファイル、インクルードファイル、ライブラリファイル)してリビルドしてみましたが結果は変わりませんでした。 他にチェックすべき点をお教え頂けると助かります。 [環境] ・WindowsXP(SP2) ・Visual Studio 2005 Professional(C++、SPなし)

  • 実行ファイルにDLLファイルを同梱したいです。

    http://kidd0320.hatenablog.com/entry/2014/06/06/142355 EXEにDLLファイルを同梱するためこちらのサイトを参考にしたのですが、ソフトを別のパソコンに入れたところ”MSVCP120.dllがないため、プログラムを開始できません。” と表示されてしまいます。 開発環境はC++でOPENCVを使っています。 開発ソフトはMicrosoft Visual Studio Express 2013 for Windows Desktopを使っています。 構成はReleaseでプラットフォームはwin32です。 インクルードファイルなどは以下のとおりです。 #include "stdafx.h" #include <stdio.h> #include <windows.h> #define snprintf _snprintf #include <opencv/highgui.h> #include <iostream> #include<fstream> using namespace std; どういった原因が考えられるでしょうか。 どなたかご教授いただけないでしょうか。

  • VC8でOpensslを使う方法

    Visual Studio 2005でOpensslを使用したいのですが、 ソースでは、#include <openssl/rand.h> のように使用。 http://www.limber.jp/?Software%2FOpenSSL%20for%20Windows にある、openssl-0.9.8e-win32-bin_dynamic.zip を利用させていただきたいのですが、 .dllや.libファイルはどこに置けば宜しいのでしょうか?

  • atlstr.hのインクルードによるエラーについて

    atlstr.hのインクルードにより生じるエラーについて質問させて頂きます。 開発環境は、Visual Studio 2008 Professional Editionです。 (Visual Studio 2008におけるプログラミングは正直まだ慣れておりませんorz) Visual Studio 2008製品内のVisual C++ 2008において、以下の操作を行いプログラムを 実行すると、コンパイルは通るのですが、プログラム実行後にエラー音が一度鳴るだけ でフォームが表示されないというエラーが発生します。その際、タスクマネージャでプロセ スを確認するとプログラム自体は動いているようで、”AtlStrTest.exe”というプロセスが実 行されているのが確認できます。 1.[ファイル]->[新規作成]->[プロジェクト]で新しいプロジェクトダイアログを表示させる 2.[Visual C++]->[CLR]->[Windows フォーム アプリケーション]を選択し、プロジェクト名   ”AtlStrTest”でプロジェクトを新規作成 3.プロジェクト内に生成された”atdafx.h”の”// TODO: プログラムに必要な追加ヘッダー   をここで参照してください。”というコメントの下に#include <atlstr.h>の一行を追加する  原因を分析しようにも、ヘッダをインクルードしただけでエラーが起きるという状況がは じめてなので、途方に暮れている状態です。 大変恐縮ですが、このatlstr.hのインクルードによるエラーがなぜ発生したのかについて、 どなたかアドバイスよろしくお願いいたします。 【関連情報】  同様の操作を、Win32コンソールアプリケーションで実行したときは、このようなエラーは 出ませんでした

  • C言語にてsin,cosは何?

    C言語でsin、cosを計算したところ、答えが違っていました。 netで探したところ<math.h>をincludeしていないせいだとわかったのですが、 <math.h>を指定しなかったら何を計算しているんでしょうか? Visual Studio 2013 win7 #include<stdio.h> #include <math.h> int main(void){ printf("結果=%f\n",sin(0.5)); }

  • .NET C++ 2002でのダイアログベースアプリケーションの作り方

    .NET C++ 2002のマネージコードでダイアログベースのアプリケーションを作ろうと考えています。手始めに自動で作成される空のアプリケーションを実行すると、コンソールアプリケーションのようになってしまいます(Hello Worldを表示して終了)。 <手順> (1) Visual Studio.NET 2002を開き、新規プロジェクトの作成で、「Managed C++アプリケーション」を選択 (2) 自動的に作成されたアプリケーションをビルド・実行 VB.NETやC#.NETでは「WINDOWSアプリケーション」を選択すると、ダイアログベースのアプリケーションを作れますが、同様のことをC++.NETで行うには、どうすればよいのでしょうか。

  • DLL関数を使ったプログラム

     DLL関数を使ったプログラムを動かしたんですが、ERRORが解決できず 困っています。DLLを作成したのはいいのですが、それをLoadLibraryで読み込もうとしても指定したプロシージャが見つからないというエラーになるようです。使用している環境はVisual Studio.NET2003です。  以下はDLLのソースです。 // plug.c // #include <windows.h> #include <stdio.h> __declspec(dllexport) void CALLBACK TestFunc() {    printf("DLLのTestFunc()関数が実行されました。\n"); } これをビルドするとplug.dllとplug.expとplug.libが作成されました。  そしてこれを使用したプログラムが // stab.c // #include <windows.h> #include <stdio.h> typedef void (*TestFunc)(void); void main() {     HMODULE hModule;     DWORD error;     TestFunc funcPointer;     hModule = LoadLibrary(TEXT("plug"));     error = GetLastError();//error値が127     funcPointer = (TestFunc)GetProcAddress(hModule,TEXT("TestFunc"));     funcPointer();     FreeLibrary(hModule);     getchar(); } LoadLibrary関数を使用してアプリのメモリ空間にDLLを読み込もうとしているんですが、ここでハンドルが正確に渡されていないみたいなんです。どうしてこうなるのか分かりません。わかる方いらっしゃったらよろしくお願いします。

専門家に質問してみよう