ハルhal
デジタル コンテンツ

pc2

作って学ぶ
ハードとソフト

アルゴリズム
電子回路

 






このサイトはHPです
ブログではありません
要望・意見は
下記の掲示場を利用して
下さいまたブログも見て下さい

 

ロボット・DOSV掲示板兼Blog

懐かしのコンピュータ
Apple II Apple2
PC9801 PC9821

roboto

Topに戻る

ララ Lara
アナログ コンテンツ

Lara座れ
動画で学ぶ
躾と訓練
動画メニュー


工作


集団練習メニュー


しつけ 訓練コラム




最後にララについて

このサイトはHPです
ブログではありません
要望・意見は
下記の掲示場を利用して
下さいまたブログも見て下さい

Laraララの
ブログ

犬のしつけと訓練
掲示板


掲示板の利用規則

 

 

 

 

Lara伏せ
Topに戻る
松本 ワンワンクラブ
わんわんクラブ

 

回答済みVisual Studio C++ 2008/2010 Express EditionでWindowsフォームアプリケーションでwin32apiを使用する。その2
c++ cli  Form で ディスプレイ 解像度の変更プログラムを作る
学習内容 
1. c++ cli Form でwin32apiを使用
2. ref class 参照クラスの配列を作る
3. 画面 解像度の変更
4. フォームFormにコマンドラインから引数を読み込む
5. デスクトップに引数付きのショートカットを作る
6.  解像度の変更 マルチディスプレイ対応 カスタム解像度対応
7.  解像度の変更をレジスタ登録する

回答済みVisual Studio C++ 2008/2010 Express EditionでWindowsフォームアプリケーションではC++/CLIが採用されているので、.NET Frameworkを使用する。
有料版にはMFCが付いているが、無料版にはない。Formアプリケーションにwin32apiを使用することは御法度のようであるが、邪道で使う方法

までプロジェクトでFormアプリケーションを作成、 今回の作成では ref class 参照クラスの配列を作る。フォームFormにコマンドラインから引数を読み込むため、次のデバッグモードで使用する。

コンパイルの準備  プロジェクト プロパティ 全般
プロジェクト プロパティ

プロジェクト プロパティ リンカー コマンドライン
/INCREMENTAL /NOLOGO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib"
リンカー コマンドライン

今回作るアプリケーション

デバック モードでは コマンドラインから
resolution_change.exe 1024 768 32 60 で引数を渡すことができる

見本のダウンロード exe zip ソース


配布用 のコンパイル

Microsoft .NET Framework 4 (Web インストーラー) が必要

http://www.microsoft.com/downloads/ja-jp/details.aspx?displaylang=ja&FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992

どうしてもDLLでしかコンパイルできないときは vcredist_x86.exeをインストールが必要
clrとマルチスレッド/MTは併用できない
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=A7B7A05E-6DE6-4D3A-A423-37BF0912DB84


赤字は入力


// disp32form1.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"
#include "Form1.h"
using namespace disp32form1;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
// コントロールが作成される前に、Windows XP ビジュアル効果を有効にします
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);

// メイン ウィンドウを作成して、実行します
Application::Run(gcnew Form1(args)); //argsを付ける
return 0;
}



stdafx.hの内容

// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
#pragma once
#include"windows.h"
#include "commctrl.h"
#include <SDKDDKVer.h>
#include "d_data.h"
#include <commctrl.h>
#include <shlobj.h>

// compile with: /clr
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

// マーシャリング用ヘッダ
//http://msdn.microsoft.com/ja-jp/library/bb531313.aspx
#include <msclr/marshal.h>



d_data.cpp

#include "StdAfx.h"
#include "d_data.h"
d_data::d_data(void){
no=-1;
x_data=0;
y_data=0;
perpel=0;
hz=0;
}


d_data.h

#pragma once
ref class d_data
{
public:
d_data(void);
int no;
int x_data;
int y_data;
int perpel;
int hz;
};


disp.h

#pragma once
ref class disp
{
public:
// DEVMODE* dispmode; // ディスプレイモード // ネイティブ・コードのクラス(※ポインタ)
static array<d_data^>^ disp_data; //参照クラスの配列の収納場所を作る
int old_no;
int old_x_data;
int old_y_data;
int old_perpel;
int old_hz;
int disp_end_no;
int pr_sec_flag;
disp(void);
//========================
// PDISPLAY_DEVICE lpDisplayDevice; // ディスプレイデバイス情報を受け取る構造体へのポインタ
LPCTSTR lpszDeviceName; // ディスプレイデバイス NULLはプライマリーになる
//======================-
int disp_device(DWORD iDevNum);
int disp_use(DWORD iDevNum);
void disp_old(void);
int disp_chang(int width_x,int height_y,int perpel, int frequency_hz, DWORD iDevNum,int reg_w);
//bool GetDisplayDeviceName(CAtlStringArray& astrDeviceName);
int disp_no(DWORD iDevNum);

};


disp.cpp

#include "StdAfx.h"
#include "disp.h"
#include "d_data.h"
//=====================
#include <tchar.h> // L _T
disp::disp(void)
{
static DEVMODE dispmode; // デバイス構造体
disp_data = gcnew array<d_data^> (1000); //参照クラスの配列の収納場所を作る
// DWORD dispNO=0;
// lpszDeviceName=disp::disp_device(dispNO);
EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dispmode ); // NULLはプライマリーディスプレイ解像度のレジストリ保存値を求める
// EnumDisplaySettings( lpszDeviceName, ENUM_REGISTRY_SETTINGS, &dispmode ); // ディスプレイ解像度のレジストリ保存値を求める
old_x_data = dispmode.dmPelsWidth;
old_y_data = dispmode.dmPelsHeight;
old_perpel = dispmode.dmBitsPerPel;
old_hz = dispmode.dmDisplayFrequency;
}
int disp::disp_no(DWORD iDevNum){
static DEVMODE dispmode; // デバイス構造体
//============================
DISPLAY_DEVICE dispDevice = {sizeof(dispDevice)}; //http://oshiete.goo.ne.jp/qa/4621536.html
// DWORD iDevNum = 0; // ディスプレイデバイスが 3 つある場合、各インデックスの値は、0、1、2 となります。DWORD iDevNum = 0;
DWORD dwFlags=NULL;
if(!EnumDisplayDevices(0,iDevNum,&dispDevice,0) ){
MessageBox(NULL, TEXT("ディスプレイデバイス取得失敗しました"), TEXT(""), 0);
return 1;
}
else {// MessageBox(NULL, TEXT(dispDevice.DeviceName), TEXT(""), 0); //ディスプレイネームのチェック用
}
//===========================-dispDevice.DeviceName
EnumDisplaySettings( dispDevice.DeviceName, ENUM_REGISTRY_SETTINGS, &dispmode ); // NULLはプライマリーディスプレイ解像度のレジストリ保存値を求める
// EnumDisplaySettings( lpszDeviceName, ENUM_REGISTRY_SETTINGS, &dispmode ); // ディスプレイ解像度のレジストリ保存値を求める

old_x_data = dispmode.dmPelsWidth;
old_y_data = dispmode.dmPelsHeight;
old_perpel = dispmode.dmBitsPerPel;
old_hz = dispmode.dmDisplayFrequency;
return 0;
}
//http://support.microsoft.com/kb/197671/ja
//http://www.atelier-blue.com/program/mdirectx/3d/3d02-05.htm direct3d

//LPCTSTR disp::disp_device(DWORD iDevNum){ // ディスプレイデバイスが 3 つある場合、各インデックスの値は、0、1、2 となります。
int disp::disp_device(DWORD iDevNum){ // ディスプレイデバイスが 3 つある場合、各インデックスの値は、0、1、2 となります。
//static DEVMODE dispmode; // ディスプレイモード
DISPLAY_DEVICE dispDevice = {sizeof(dispDevice)}; //http://oshiete.goo.ne.jp/qa/4621536.html
iDevNum = 0; // ディスプレイデバイスが 3 つある場合、各インデックスの値は、0、1、2 となります。DWORD iDevNum = 0;
//pfnEnumDisplayDrivers(0, nDevNum, &dispDevice, 0);
DWORD dwFlags=NULL;
// if(!EnumDisplayDevices(NULL,iDevNum,&dispDevice,dwFlags) ){
if(!EnumDisplayDevices(0,iDevNum,&dispDevice,0) ){
// lpDisplayDevice.DeviceName;
MessageBox(NULL, TEXT("ディスプレイデバイス取得失敗しました"), TEXT(""), 0);
return -1;//"\\.\DISPLAY1";
}
else { MessageBox(NULL, TEXT(dispDevice.DeviceName), TEXT(""), 0); //ディスプレイネームのチェック用
}
return 0;//dispDevice.DeviceName;

}

int disp::disp_use(DWORD iDevNum)
{

//使用できるディスプレイモードの確認 配列に収納
static DEVMODE dispmode; // ディスプレイモード
int disp_no;
//============================
DISPLAY_DEVICE dispDevice = {sizeof(dispDevice)}; //http://oshiete.goo.ne.jp/qa/4621536.html
// DWORD iDevNum = 0; // ディスプレイデバイスが 3 つある場合、各インデックスの値は、0、1、2 となります。DWORD iDevNum = 0;
DWORD dwFlags=NULL;
if(!EnumDisplayDevices(0,iDevNum,&dispDevice,0) ){
MessageBox(NULL, TEXT("ディスプレイデバイス取得失敗しました"), TEXT(""), 0);
return 1;
}
else {// MessageBox(NULL, TEXT(dispDevice.DeviceName), TEXT(""), 0); //ディスプレイネームのチェック用
}
//===========================-
disp_no = 0;
while( TRUE )
{
//全モードの列挙
// if( !EnumDisplaySettings( lpDisplayDevice->DeviceName, disp_no, &dispmode ) ) break;
// if( !EnumDisplaySettings( NULL, disp_no, &dispmode ) ) break;
if( !EnumDisplaySettings(dispDevice.DeviceName, disp_no, &dispmode ) ) return 0;
// リッチテキストに表示する
disp_data[disp_no]=gcnew d_data; //重要 クラスの配列の中身の確保
disp_data[disp_no]->no = disp_no;
disp_data[disp_no]->x_data =dispmode.dmPelsWidth; // 解像度横サイズ(width x)
disp_data[disp_no]->y_data =dispmode.dmPelsHeight; // 解像度縦サイズ(hight y)
disp_data[disp_no]->perpel =dispmode.dmBitsPerPel; // 1ピクセル当たりのビット数
disp_data[disp_no]->hz =dispmode.dmDisplayFrequency; // リフレッシュ周波数
pr_sec_flag=dispmode.dmDisplayFlags; // プライマリモニタでなければ0イガイ
disp_end_no=disp_no;
disp_no++;
}
return 0;
}
/*
int disp::disp_chang(int width_x,int height_y,int perpel, int frequency_hz){
static DEVMODE dispmode; // デバイス構造体
HDC hdc; // 現在の色解像度を取得するためのデバイスコンテキスト
hdc = GetDC(NULL); // デバイス構造体を初期化する
ZeroMemory(&dispmode,sizeof(dispmode));
dispmode.dmSize = sizeof(dispmode);
dispmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
dispmode.dmBitsPerPel = GetDeviceCaps(hdc,BITSPIXEL);
dispmode.dmPelsWidth = width_x; // 解像度横サイズ(width x)
dispmode.dmPelsHeight =height_y; // 解像度縦サイズ(hight y)
dispmode.dmBitsPerPel=perpel; // 1ピクセル当たりのビット数
dispmode.dmDisplayFrequency =frequency_hz; // リフレッシュ周波数
ReleaseDC(NULL,hdc);
// ディスプレイモードのチック合格なら解像度変更を行う。
if( ChangeDisplaySettings(&dispmode,CDS_TEST) == DISP_CHANGE_SUCCESSFUL ) {
ChangeDisplaySettings(&dispmode,CDS_FULLSCREEN);
return 0;
}
return 1;
}*/
int disp::disp_chang(int width_x,int height_y,int perpel, int frequency_hz, DWORD iDevNum,int reg_w){
static DEVMODE dispmode; // デバイス構造体
//===========================-
DISPLAY_DEVICE dispDevice = {sizeof(dispDevice)}; //http://oshiete.goo.ne.jp/qa/4621536.html
DWORD dwFlags=NULL;
// DWORD iDevNum=0;
// if(!EnumDisplayDevices(NULL,iDevNum,&dispDevice,dwFlags) ){
if(!EnumDisplayDevices(0,iDevNum,&dispDevice,0) ){
// lpDisplayDevice.DeviceName;
MessageBox(NULL, TEXT("ディスプレイデバイス取得失敗しました"), TEXT(""), 0);
return 1;
}
else {// MessageBox(NULL, TEXT(dispDevice.DeviceName), TEXT(""), 0); //ディスプレイネームのチェック用
}
//===========================-
HDC hdc; // 現在の色解像度を取得するためのデバイスコンテキスト
hdc = GetDC(NULL); // デバイス構造体を初期化する
ZeroMemory(&dispmode,sizeof(dispmode));
dispmode.dmSize = sizeof(dispmode);
dispmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
dispmode.dmBitsPerPel = GetDeviceCaps(hdc,BITSPIXEL); //ok
dispmode.dmPelsWidth = width_x; // 解像度横サイズ(width x)ok
dispmode.dmPelsHeight =height_y; // 解像度縦サイズ(hight y)ok
dispmode.dmBitsPerPel=perpel; // 1ピクセル当たりのビット数 ok
dispmode.dmDisplayFrequency =frequency_hz; // リフレッシュ周波数 ok
// dispmode.dmPosition="0x20"; // Windows 98、Windows 2000:マルチモニタ構成でのデバイス位置 &h20 DM_POSITION

ReleaseDC(NULL,hdc);
//拡張
// LPCSTR lpszDeviceName=NULL; //既存のディスプレー lpDisplayDevice->DeviceName

HWND hwnd=NULL;
LPVOID lParam=NULL;
// ディスプレイモードのチック合格なら解像度変更を行う。
/*if( ChangeDisplaySettingsEx(lpszDeviceName,&dispmode,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ) {
ChangeDisplaySettingsEx(lpszDeviceName,&dispmode,CDS_FULLSCREEN,lParam);*/
/*if( ChangeDisplaySettingsEx(lpDisplayDevice->DeviceName,&dispmode, hwnd,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ) {
ChangeDisplaySettingsEx(lpDisplayDevice->DeviceName,&dispmode, hwnd,CDS_FULLSCREEN,lParam);*/
/*if( ChangeDisplaySettingsEx(NULL,&dispmode, hwnd,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ) { //現在のディスプレーに対して
ChangeDisplaySettingsEx(NULL,&dispmode, hwnd,CDS_FULLSCREEN,lParam);//現在のディスプレーに対して*/
if(reg_w==1){
if( ChangeDisplaySettingsEx(dispDevice.DeviceName,&dispmode, hwnd,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ){ //lpszDeviceNameのディスプレーに対して
ChangeDisplaySettingsEx(dispDevice.DeviceName,&dispmode, hwnd,CDS_UPDATEREGISTRY,lParam);//lpszDeviceNameのディスプレーに対してCDS_UPDATEREGISTRY 設定変更を行い、情報をレジストリに書き込む。
return 0; }
}else{
if( ChangeDisplaySettingsEx(dispDevice.DeviceName,&dispmode, hwnd,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ) { //lpszDeviceNameのディスプレーに対して
ChangeDisplaySettingsEx(dispDevice.DeviceName,&dispmode, hwnd,CDS_FULLSCREEN,lParam);//lpszDeviceNameのディスプレーに対して CDS_FULLSCREEN 一時的に切り替える。アプリケーション終了後、元の状態に戻される
return 0; }
} //end else
return 1;
}

//http://msdn.microsoft.com/ja-jp/library/cc428310.aspx
//http://msdn.microsoft.com/ja-jp/library/cc428309.aspx
//http://tokovalue.web.infoseek.co.jp/function/ChangeDisplaySettingsEx.htm
//http://msdn.microsoft.com/en-us/library/dd183411(v=vs.85).aspx
void disp::disp_old(void){
static DEVMODE dispmode; // デバイス構造体
HDC hdc; // 現在の色解像度を取得するためのデバイスコンテキスト
hdc = GetDC(NULL); // デバイス構造体を初期化する
ZeroMemory(&dispmode,sizeof(dispmode));
dispmode.dmSize = sizeof(dispmode);
dispmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
dispmode.dmBitsPerPel = GetDeviceCaps(hdc,BITSPIXEL);
dispmode.dmPelsWidth = old_x_data; // 解像度横サイズ(width x)
dispmode.dmPelsHeight =old_y_data; // 解像度縦サイズ(hight y)
dispmode.dmBitsPerPel=old_perpel; // 1ピクセル当たりのビット数
dispmode.dmDisplayFrequency =old_hz; // リフレッシュ周波数
ReleaseDC(NULL,hdc);
HWND hwnd=NULL;
LPVOID lParam=NULL;
// ディスプレイモードのチック合格なら解像度変更を行う。
//if( ChangeDisplaySettings(&dispmode,CDS_TEST) == DISP_CHANGE_SUCCESSFUL ) {
// ChangeDisplaySettings(&dispmode,CDS_FULLSCREEN);}
if( ChangeDisplaySettingsEx(NULL,&dispmode, hwnd,CDS_TEST,lParam) == DISP_CHANGE_SUCCESSFUL ) { //現在のディスプレーに対して
ChangeDisplaySettingsEx(NULL,&dispmode, hwnd,CDS_FULLSCREEN,lParam);}//現在のディスプレーに対して

}



Form1.hの入力

#pragma once
using namespace System::Diagnostics;
using namespace msclr::interop; // msclr
#include "d_data.h"
#include "disp.h"
#include "shortcut.h"

namespace disp32form1 {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

/// <summary>
/// Form1 の概要
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
// Form1(void)
array<System::String ^> ^Args_data;
Form1(array<System::String ^> ^args)//voiを変更

{
InitializeComponent();
//
//TODO: ここにコンストラクター コードを追加します

Args_data = args; // 追加
//EnableWindow(ListView_GetHeader(reinterpret_cast(this->listView1->Handle.ToInt32())),FALSE);
//
}

protected:
/// <summary>
/// 使用中のリソースをすべてクリーンアップします。
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ button1;
protected:

private: System::Windows::Forms::ListBox^ listBox1;

private: System::Windows::Forms::TextBox^ textBox2;

private:
/// <summary>
/// 必要なデザイナー変数です。
/// </summary>
System::ComponentModel::Container ^components;
private: System::Windows::Forms::TextBox^ textBox1;
private: System::Windows::Forms::TextBox^ textBox3;
private: System::Windows::Forms::TextBox^ textBox4;
private: System::Windows::Forms::TextBox^ textBox6;
private: System::Windows::Forms::TextBox^ textBox5;
private: System::Windows::Forms::Button^ button3;
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::Label^ label2;
private: System::Windows::Forms::Label^ label3;
private: System::Windows::Forms::Label^ label4;
private: System::Windows::Forms::Label^ label5;
private: System::Windows::Forms::TextBox^ textBox7;
private: System::Windows::Forms::TextBox^ textBox8;
private: System::Windows::Forms::TextBox^ textBox9;
private: System::Windows::Forms::TextBox^ textBox10;
private: System::Windows::Forms::Label^ label6;
private: System::Windows::Forms::Button^ button4;
private: System::Windows::Forms::Label^ label7;
private: System::Windows::Forms::TextBox^ textBox11;
private: System::Windows::Forms::Label^ label8;
private: System::Windows::Forms::TextBox^ textBox12;
private: System::Windows::Forms::Label^ label9;
private: System::Windows::Forms::Button^ button2;
private: System::Windows::Forms::Button^ button5;
//============================================================-
static disp m_disp;
static shortcut shc;
// static DEVMODE dispmode; // デバイス構造体 混合型はサポートされていません

//============================================================-

#pragma region Windows Form Designer generated code
/// <summary>
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
/// コード エディターで変更しないでください。
/// </summary>
void InitializeComponent(void)
{
this->button1 = (gcnew System::Windows::Forms::Button());
this->listBox1 = (gcnew System::Windows::Forms::ListBox());
this->textBox2 = (gcnew System::Windows::Forms::TextBox());
this->textBox1 = (gcnew System::Windows::Forms::TextBox());
this->textBox3 = (gcnew System::Windows::Forms::TextBox());
this->textBox4 = (gcnew System::Windows::Forms::TextBox());
this->textBox5 = (gcnew System::Windows::Forms::TextBox());
this->textBox6 = (gcnew System::Windows::Forms::TextBox());
this->button3 = (gcnew System::Windows::Forms::Button());
this->label1 = (gcnew System::Windows::Forms::Label());
this->label2 = (gcnew System::Windows::Forms::Label());
this->label3 = (gcnew System::Windows::Forms::Label());
this->label4 = (gcnew System::Windows::Forms::Label());
this->label5 = (gcnew System::Windows::Forms::Label());
this->textBox7 = (gcnew System::Windows::Forms::TextBox());
this->textBox8 = (gcnew System::Windows::Forms::TextBox());
this->textBox9 = (gcnew System::Windows::Forms::TextBox());
this->textBox10 = (gcnew System::Windows::Forms::TextBox());
this->label6 = (gcnew System::Windows::Forms::Label());
this->button4 = (gcnew System::Windows::Forms::Button());
this->label7 = (gcnew System::Windows::Forms::Label());
this->textBox11 = (gcnew System::Windows::Forms::TextBox());
this->label8 = (gcnew System::Windows::Forms::Label());
this->textBox12 = (gcnew System::Windows::Forms::TextBox());
this->label9 = (gcnew System::Windows::Forms::Label());
this->button2 = (gcnew System::Windows::Forms::Button());
this->button5 = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
//
// button1
//
this->button1->BackColor = System::Drawing::Color::DeepPink;
this->button1->Location = System::Drawing::Point(83, 1);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(82, 23);
this->button1->TabIndex = 0;
this->button1->Text = L"変更";
this->button1->UseVisualStyleBackColor = false;
this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
//
// listBox1
//
this->listBox1->FormattingEnabled = true;
this->listBox1->ItemHeight = 12;
this->listBox1->Location = System::Drawing::Point(12, 115);
this->listBox1->Name = L"listBox1";
this->listBox1->Size = System::Drawing::Size(523, 352);
this->listBox1->TabIndex = 2;
this->listBox1->SelectedIndexChanged += gcnew System::EventHandler(this, &Form1::listBox1_SelectedIndexChanged);
//
// textBox2
//
this->textBox2->Location = System::Drawing::Point(171, 3);
this->textBox2->Name = L"textBox2";
this->textBox2->Size = System::Drawing::Size(193, 19);
this->textBox2->TabIndex = 5;
//
// textBox1
//
this->textBox1->Location = System::Drawing::Point(48, 61);
this->textBox1->Name = L"textBox1";
this->textBox1->Size = System::Drawing::Size(47, 19);
this->textBox1->TabIndex = 6;
//
// textBox3
//
this->textBox3->Location = System::Drawing::Point(152, 59);
this->textBox3->Name = L"textBox3";
this->textBox3->Size = System::Drawing::Size(78, 19);
this->textBox3->TabIndex = 7;
//
// textBox4
//
this->textBox4->Location = System::Drawing::Point(255, 61);
this->textBox4->Name = L"textBox4";
this->textBox4->Size = System::Drawing::Size(69, 19);
this->textBox4->TabIndex = 8;
//
// textBox5
//
this->textBox5->Location = System::Drawing::Point(353, 61);
this->textBox5->Name = L"textBox5";
this->textBox5->Size = System::Drawing::Size(48, 19);
this->textBox5->TabIndex = 9;
//
// textBox6
//
this->textBox6->Location = System::Drawing::Point(467, 63);
this->textBox6->Name = L"textBox6";
this->textBox6->Size = System::Drawing::Size(68, 19);
this->textBox6->TabIndex = 10;
//
// button3
//
this->button3->BackColor = System::Drawing::Color::Chartreuse;
this->button3->Location = System::Drawing::Point(2, 1);
this->button3->Name = L"button3";
this->button3->Size = System::Drawing::Size(75, 23);
this->button3->TabIndex = 11;
this->button3->Text = L"元に戻す";
this->button3->UseVisualStyleBackColor = false;
this->button3->Click += gcnew System::EventHandler(this, &Form1::button3_Click);
//
// label1
//
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(23, 63);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(19, 12);
this->label1->TabIndex = 12;
this->label1->Text = L"No";
//
// label2
//
this->label2->AutoSize = true;
this->label2->Location = System::Drawing::Point(129, 65);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(17, 12);
this->label2->TabIndex = 13;
this->label2->Text = L"横";
//
// label3
//
this->label3->AutoSize = true;
this->label3->Location = System::Drawing::Point(232, 63);
this->label3->Name = L"label3";
this->label3->Size = System::Drawing::Size(17, 12);
this->label3->TabIndex = 14;
this->label3->Text = L"縦";
//
// label4
//
this->label4->AutoSize = true;
this->label4->Location = System::Drawing::Point(330, 65);
this->label4->Name = L"label4";
this->label4->Size = System::Drawing::Size(17, 12);
this->label4->TabIndex = 15;
this->label4->Text = L"色";
//
// label5
//
this->label5->AutoSize = true;
this->label5->Location = System::Drawing::Point(407, 65);
this->label5->Name = L"label5";
this->label5->Size = System::Drawing::Size(54, 12);
this->label5->TabIndex = 16;
this->label5->Text = L"リフレッシュ";
//
// textBox7
//
this->textBox7->Location = System::Drawing::Point(152, 93);
this->textBox7->Name = L"textBox7";
this->textBox7->Size = System::Drawing::Size(78, 19);
this->textBox7->TabIndex = 17;
//
// textBox8
//
this->textBox8->Location = System::Drawing::Point(255, 93);
this->textBox8->Name = L"textBox8";
this->textBox8->Size = System::Drawing::Size(69, 19);
this->textBox8->TabIndex = 18;
//
// textBox9
//
this->textBox9->Location = System::Drawing::Point(353, 90);
this->textBox9->Name = L"textBox9";
this->textBox9->Size = System::Drawing::Size(48, 19);
this->textBox9->TabIndex = 19;
//
// textBox10
//
this->textBox10->Location = System::Drawing::Point(467, 90);
this->textBox10->Name = L"textBox10";
this->textBox10->Size = System::Drawing::Size(67, 19);
this->textBox10->TabIndex = 20;
//
// label6
//
this->label6->AutoSize = true;
this->label6->Location = System::Drawing::Point(117, 96);
this->label6->Name = L"label6";
this->label6->Size = System::Drawing::Size(29, 12);
this->label6->TabIndex = 21;
this->label6->Text = L"引数";
//
// button4
//
this->button4->BackColor = System::Drawing::Color::MediumPurple;
this->button4->Location = System::Drawing::Point(2, 24);
this->button4->Name = L"button4";
this->button4->Size = System::Drawing::Size(163, 27);
this->button4->TabIndex = 22;
this->button4->Text = L"ディスクトップにショートカットを作る";
this->button4->UseVisualStyleBackColor = false;
this->button4->Click += gcnew System::EventHandler(this, &Form1::button4_Click);
//
// label7
//
this->label7->AutoSize = true;
this->label7->Location = System::Drawing::Point(389, 29);
this->label7->Name = L"label7";
this->label7->Size = System::Drawing::Size(74, 12);
this->label7->TabIndex = 23;
this->label7->Text = L"ディスプレイNo";
//
// textBox11
//
this->textBox11->Location = System::Drawing::Point(470, 28);
this->textBox11->Name = L"textBox11";
this->textBox11->Size = System::Drawing::Size(46, 19);
this->textBox11->TabIndex = 26;
this->textBox11->TextChanged += gcnew System::EventHandler(this, &Form1::textBox11_TextChanged);
//
// label8
//
this->label8->AutoSize = true;
this->label8->Location = System::Drawing::Point(311, 46);
this->label8->Name = L"label8";
this->label8->Size = System::Drawing::Size(167, 12);
this->label8->TabIndex = 25;
this->label8->Text = L"プライマリー0 セカンダリー123..";
//
// textBox12
//
this->textBox12->Location = System::Drawing::Point(278, 24);
this->textBox12->Name = L"textBox12";
this->textBox12->Size = System::Drawing::Size(102, 19);
this->textBox12->TabIndex = 27;
//
// label9
//
this->label9->AutoSize = true;
this->label9->Location = System::Drawing::Point(169, 31);
this->label9->Name = L"label9";
this->label9->Size = System::Drawing::Size(103, 12);
this->label9->TabIndex = 28;
this->label9->Text = L"現在のディスプレーは";
//
// button2
//
this->button2->Location = System::Drawing::Point(381, 1);
this->button2->Name = L"button2";
this->button2->Size = System::Drawing::Size(145, 23);
this->button2->TabIndex = 29;
this->button2->Text = L"ディスプレイNo変更";
this->button2->UseVisualStyleBackColor = true;
this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click_1);
//
// button5
//
this->button5->BackColor = System::Drawing::Color::Crimson;
this->button5->Location = System::Drawing::Point(9, 87);
this->button5->Name = L"button5";
this->button5->Size = System::Drawing::Size(102, 25);
this->button5->TabIndex = 30;
this->button5->Text = L"レジストリ書き込み";
this->button5->UseVisualStyleBackColor = false;
this->button5->Click += gcnew System::EventHandler(this, &Form1::button5_Click);
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->BackColor = System::Drawing::Color::Plum;
this->ClientSize = System::Drawing::Size(550, 479);
this->Controls->Add(this->button5);
this->Controls->Add(this->button2);
this->Controls->Add(this->label9);
this->Controls->Add(this->textBox12);
this->Controls->Add(this->textBox11);
this->Controls->Add(this->label8);
this->Controls->Add(this->label7);
this->Controls->Add(this->button4);
this->Controls->Add(this->label6);
this->Controls->Add(this->textBox10);
this->Controls->Add(this->textBox9);
this->Controls->Add(this->textBox8);
this->Controls->Add(this->textBox7);
this->Controls->Add(this->label5);
this->Controls->Add(this->label4);
this->Controls->Add(this->label3);
this->Controls->Add(this->label2);
this->Controls->Add(this->label1);
this->Controls->Add(this->button3);
this->Controls->Add(this->textBox6);
this->Controls->Add(this->textBox5);
this->Controls->Add(this->textBox4);
this->Controls->Add(this->textBox3);
this->Controls->Add(this->textBox1);
this->Controls->Add(this->textBox2);
this->Controls->Add(this->listBox1);
this->Controls->Add(this->button1);
this->Name = L"Form1";
this->Text = L"画面解像度変更";
this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
this->ResumeLayout(false);
this->PerformLayout();

}

#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
// disp m_disp;

int width_x = int::Parse(textBox3->Text); // 解像度横サイズ(width x)
int height_y =int::Parse(textBox4->Text); // 解像度縦サイズ(hight y)
int perpel =int::Parse(textBox5->Text); // 解像度縦サイズ(hight y)
int frequency_hz =int::Parse(textBox6->Text); // リフレッシュ周波数
DWORD prm_sec_no=DWORD::Parse(textBox11->Text);
//==========
String^ text;
text=textBox3->Text+" "+textBox4->Text+" "+textBox5->Text+" "+textBox6->Text;
int flag=0;
int disp_no;
for(disp_no=0;disp_no<=m_disp.disp_end_no;disp_no++){
//フォームへの引数が解像度と適合しているかのチェック
if( m_disp.disp_data[disp_no]->x_data== width_x &&
m_disp.disp_data[disp_no]->y_data== height_y &&
m_disp.disp_data[disp_no]->perpel== perpel &&
m_disp.disp_data[disp_no]->hz==frequency_hz) flag=1;
}//next
//==========-
int y;
if(flag==1){
y=m_disp.disp_chang( width_x, height_y, perpel, frequency_hz, prm_sec_no,0);
if(y==1) MessageBox::Show("解像度変更失敗");

} else{
if (MessageBox::Show(text+"対応していない解像度です。強制変更してみますか?", "確認", MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes) {
y=m_disp.disp_chang( width_x, height_y, perpel, frequency_hz, prm_sec_no,0);
if(y==1) MessageBox::Show("解像度変更失敗");
}

}//end else
}
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
//フォームへの引数の引き渡し 横 縦 色 リフレッシュ 例1028 768 32 60
int h_data0;
int h_data1;
int h_data2;
int h_data3;
int h_data4;
/*======================================
if(0 < CommandLineArgs->Length)

{ System::Diagnostics::Debug::WriteLine("引数の個数 = " + CommandLineArgs->Length);
for(int i = 0;i < CommandLineArgs->Length;i++)System::Diagnostics::Debug::WriteLine("No." + i + " = " + CommandLineArgs[i]);
}else
{ CommandLineArgs = gcnew array<String ^>(2);
CommandLineArgs[0] = "";
}

{ MessageBox::Show("引数の個数 = " + CommandLineArgs->Length);
for(int i = 0;i < CommandLineArgs->Length;i++) MessageBox::Show("No." + i + " = " + CommandLineArgs[i]);
}else
{ CommandLineArgs = gcnew array<String ^>(2);
CommandLineArgs[0] = "";
}
//==========================*/
if(Args_data->Length==5){
h_data0=int::Parse(Args_data[0]);
h_data1=int::Parse(Args_data[1]);
h_data2=int::Parse(Args_data[2]);
h_data3=int::Parse(Args_data[3]);
h_data4=int::Parse(Args_data[4]);

}else{ Args_data = gcnew array<String ^>(2);
Args_data[0] = "";
h_data0=0;
}
if( h_data1>1900*2 || h_data2>1200*2 || h_data3>32 || h_data4>240) { //1900*2 1200*2 以上はエラーとする
h_data0=0;
h_data1=0;
h_data2=0;
h_data3=0;
h_data4=0;

}

//フォームへの引数の引き渡し終わり
//disp m_disp;
//現在のモード
textBox3->Text=m_disp.old_x_data.ToString();
textBox4->Text=m_disp.old_y_data.ToString();
textBox5->Text=m_disp.old_perpel.ToString();
textBox6->Text=m_disp.old_hz.ToString();
//引数
textBox7->Text=h_data1.ToString();
textBox8->Text=h_data2.ToString();
textBox9->Text=h_data3.ToString();
textBox10->Text=h_data4.ToString();
textBox11->Text=h_data0.ToString();
//static DEVMODE dispmode; // デバイス構造体
//使用できるディスプレイモードの確認
DWORD prm_sec_no=DWORD::Parse(textBox11->Text);
int yet;
//レジストリより戻せるデータを読む
yet=m_disp.disp_no(prm_sec_no);
if(yet>0) MessageBox::Show("レジストリ読み込みに失敗しました。");

yet=m_disp.disp_use(prm_sec_no);
if(yet>0) MessageBox::Show("解像度取得に失敗しました。");
String^ text;
text="";
int disp_no=0;
if(m_disp.pr_sec_flag==0) textBox12->Text="プライマリー";
else textBox12->Text="セカンダリ";

/*-------------------
richTextBox1->SaveFile("C:\\dispmode.rtf"); 保存する場合
richTextBox1->LoadFile("C:\\dispmode.rtf");
-------------------*/
// 使用できるディスプレイモードをリストボックスに表示
int flag=0;
if(h_data0==0 && h_data1==0 && h_data2==0 && h_data3==0 && h_data4==0) flag=-1;
int y;
//while( TRUE )
// while(m_disp.disp_data[disp_no]->no = -1)
for(disp_no=0;disp_no<=m_disp.disp_end_no;disp_no++)
{
//全モードの列挙
//if( m_disp.disp_data[disp_no]->no==-1 ) break;
// リッチテキストに表示する
text=disp_no.ToString()+" "+m_disp.disp_data[disp_no]->x_data.ToString()+" "+m_disp.disp_data[disp_no]->y_data.ToString()+
" "+m_disp.disp_data[disp_no]->perpel.ToString()+" "+m_disp.disp_data[disp_no]->hz.ToString()+"\n";
listBox1->Items->Add(text);
//フォームへの引数が解像度と適合しているかのチェック
if( m_disp.disp_data[disp_no]->x_data==h_data1 &&
m_disp.disp_data[disp_no]->y_data==h_data2 &&
m_disp.disp_data[disp_no]->perpel==h_data3 &&
m_disp.disp_data[disp_no]->hz==h_data4) flag=1;
// disp_no++;

}
//textBox1->Text=flag.ToString();
//フォームへの引数の引き渡しがあったときの処理
if(flag==1){
y=m_disp.disp_chang( h_data1,h_data2,h_data3,h_data4,prm_sec_no,0); //フォームへの引数で解像度変更
this->WindowState = FormWindowState::Minimized; //現在のフォームを最小化
MessageBox::Show("現在のフォームを最小化しました。");
}
else {
if(flag !=-1){
text= h_data0.ToString()+" "+h_data1.ToString()+" "+h_data2.ToString()+" "+h_data3.ToString()+" ";
if (MessageBox::Show(text+"対応していない解像度です。強制変更してみますか?", "確認", MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes) {
y=m_disp.disp_chang( h_data1,h_data2,h_data3,h_data4,prm_sec_no,0);
}
}

}
if(y==1) MessageBox::Show("解像度変更失敗");

/*
現在のフォームを最小化
this->WindowState = FormWindowState::Minimized;
現在のフォームを最大化
this->WindowState = FormWindowState::Maximized;
現在のフォームを最小化、あるいは最大化から元に戻す
this->WindowState = FormWindowState::Normal;
現在のフォームを非表示
this->Hide();
現在のフォームを非表示から表示
this->Show();
*/

}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
// disp m_disp;
int s_no=0;
textBox2->Text=listBox1->Text;
textBox1->Text=listBox1->SelectedIndex.ToString();
s_no=listBox1->SelectedIndex;
textBox3->Text=m_disp.disp_data[s_no]->x_data.ToString();
textBox4->Text=m_disp.disp_data[s_no]->y_data.ToString();
textBox5->Text=m_disp.disp_data[s_no]->perpel.ToString();
textBox6->Text=m_disp.disp_data[s_no]->hz.ToString();

}
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {

m_disp.disp_old();
}

private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {

//http://code.msdn.microsoft.com/VisualC-7c6bc862
//http://yokohama.cool.ne.jp/chokuto/urawaza/com/shell.html
//http://minidx.blogspot.com/2007/03/vc_14.html 文字ニツイテ
//http://fatalita.sakura.ne.jp/Junk/_T/index.html
//const TCHAR * text = _T("文字列"); と LPCTSTR text = _T("文字列"); は同じ意味です。
//http://ysmt.blog21.fc2.com/blog-entry-244.html
//http://support.microsoft.com/kb/311259/ja
//http://codezine.jp/article/detail/4774

shortcut stc;
int ret;
String^ option1;
String^ option2;
option1= textBox11->Text + " "+textBox3->Text + " "+ textBox4->Text + " " + textBox5->Text + " " + textBox6->Text;
option2="\\resolution_change "+option1+".lnk";
MessageBox::Show(option1+"解像度の準備をします");

//LPTSTR pszStr; //exeample ="1024 768 32 60";
const char* pszStr1;
marshal_context ctx1;
pszStr1 = ctx1.marshal_as<const char*>(option1);
const char* pszStr2;
marshal_context ctx2;
pszStr2 = ctx2.marshal_as<const char*>(option2);
// s2 = ctx.marshal_as<const wchar_t*>(s0);
ret=stc.Stcut(pszStr1,pszStr2);
if(ret) MessageBox::Show("デスクトップのショートカットを確認してください");

}

private: System::Void listBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
// disp m_disp;
int s_no=0;
textBox2->Text=listBox1->Text;
textBox1->Text=listBox1->SelectedIndex.ToString();
s_no=listBox1->SelectedIndex;
textBox3->Text=m_disp.disp_data[s_no]->x_data.ToString();
textBox4->Text=m_disp.disp_data[s_no]->y_data.ToString();
textBox5->Text=m_disp.disp_data[s_no]->perpel.ToString();
textBox6->Text=m_disp.disp_data[s_no]->hz.ToString();

}
private: System::Void textBox11_TextChanged(System::Object^ sender, System::EventArgs^ e) {

}
private: System::Void button2_Click_1(System::Object^ sender, System::EventArgs^ e) {
//static DEVMODE dispmode; // デバイス構造体
int yet;
DWORD prm_sec_no;
prm_sec_no=DWORD::Parse(textBox11->Text);
yet=m_disp.disp_device(prm_sec_no);
if (yet==-1) {
textBox11->Text="0";
MessageBox::Show("このNoのディスプレーは存在しません"); }

prm_sec_no=DWORD::Parse(textBox11->Text);
//レジストリより戻せるデータを読む
yet=m_disp.disp_no(prm_sec_no);
if(yet>0) MessageBox::Show("レジストリ読み込みに失敗しました。");

//使用できるディスプレイモードの確認
yet=m_disp.disp_use(prm_sec_no);
if(yet>0) MessageBox::Show("解像度取得に失敗しました。");
String^ text;
text="";
if(m_disp.pr_sec_flag==0) textBox12->Text="プライマリー";
else textBox12->Text="セカンダリ";
// 使用できるディスプレイモードをリストボックスに表示
listBox1->Items->Clear();
for(int disp_no=0;disp_no<=m_disp.disp_end_no;disp_no++){
//全モードの列挙
// リッチテキストに表示する
text=disp_no.ToString()+" "+m_disp.disp_data[disp_no]->x_data.ToString()+" "+m_disp.disp_data[disp_no]->y_data.ToString()+
" "+m_disp.disp_data[disp_no]->perpel.ToString()+" "+m_disp.disp_data[disp_no]->hz.ToString()+"\n";
listBox1->Items->Add(text);
}

}
private: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) {
// disp m_disp;
if(MessageBox::Show("解像度変更後 レジストリに書き込みを行いますか?","レジストリに書き込み危険",
MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes) {
// disp m_disp;

int width_x = int::Parse(textBox3->Text); // 解像度横サイズ(width x)
int height_y =int::Parse(textBox4->Text); // 解像度縦サイズ(hight y)
int perpel =int::Parse(textBox5->Text); // 解像度縦サイズ(hight y)
int frequency_hz =int::Parse(textBox6->Text); // リフレッシュ周波数
DWORD prm_sec_no=DWORD::Parse(textBox11->Text);
//==========
String^ text;
text=textBox3->Text+" "+textBox4->Text+" "+textBox5->Text+" "+textBox6->Text;
int disp_no;
int flag=0;
for(disp_no=0;disp_no<=m_disp.disp_end_no;disp_no++){
//フォームへの引数が解像度と適合しているかのチェック
if( m_disp.disp_data[disp_no]->x_data== width_x &&
m_disp.disp_data[disp_no]->y_data== height_y &&
m_disp.disp_data[disp_no]->perpel== perpel &&
m_disp.disp_data[disp_no]->hz==frequency_hz) flag=1;
} //next
//==========-
int y;
if(flag==1){ y=m_disp.disp_chang( width_x, height_y, perpel, frequency_hz, prm_sec_no,1);
if(y==1) MessageBox::Show("解像度変更失敗");

} else{ if (MessageBox::Show(text+"対応していない解像度です。強制変更してみますか?", "確認", MessageBoxButtons::YesNo) == System::Windows::Forms::DialogResult::Yes) {
y=m_disp.disp_chang( width_x, height_y, perpel, frequency_hz, prm_sec_no,1);
if(y==1) MessageBox::Show("解像度変更失敗");
} //end if MB

}

} //end button5
}
};
}

 

 
動画が旨くご覧いただけない場合は最新のFlash Playerをインストールしてください
web ブラウザがインターネットエクスプローラ6(IE6)以下の場合メニューが崩れてしまうことがあります。
インターネットエクスプローラ7、Sleipnir、Mozilla Firefoxをご使用ください。