前の10件 7  8  9  10  11  12  13  14  15  16  17

記事一覧

Android NDKの「hello-jni」のソースコードを見る

jni01.png
今回はAndroid NDKのサンプルプロジェクト「hello-jni」のプロジェクトファイルの中を覗いて見る。




プロジェクト内のフォルダ/ファイル構造は以下のようになっている。

\samples\hello-jni\
│ AndroidManifest.xml
│ default.properties
│ 
├―jni
│   Android.mk
│   hello-jni.c
│   
├―res
│ └―values
│     strings.xml
│     
├―src
│ └―com
│   └―example
│     └―hellojni
│         HelloJni.java
│         
└―tests  (省略:テストプロジェクト用フォルダ)






■AndroidManifest.xml

このファイルはC言語を利用しないJavaのみのプロジェクトのときと変わらないようだ。Eclipse上でAndroidプロジェクトを作成するときに指定する項目が保存されている。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.hellojni"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="3" />
    <application android:label="@string/app_name"
                 android:debuggable="true">
        <activity android:name=".HelloJni"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest> 






■default.properties

このファイルはC言語を利用しないJavaのみのプロジェクトのときと変わらないようだ。Eclipse上でAndroidプロジェクトを作成するときに指定するターゲットAndroidバージョンが保存されている。

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
# 
# This file must be checked in Version Control Systems.
# 
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.

# Project target.
target=android-8






■Android.mk

このファイルはC言語のソースファイルをビルドするためのmakeファイルになっている。

# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)






■hello-jni.c

このファイルはC言語のソースファイル本体だ。
Java_com_example_hellojni_HelloJni_stringFromJNI()という関数を1つ定義、その関数中で文字列を返すだけのソースコードとなっている。

/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
#include <string.h>
#include <jni.h>

/* This is a trivial JNI example where we use a native method
 * to return a new VM String. See the corresponding Java source
 * file located at:
 *
 *   apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java
 */
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}






■strings.xml

このファイルはC言語を利用しないJavaのみのプロジェクトのときと変わらないようだ。Eclipse上でAndroidプロジェクトを作成するときに指定するアプリケーション名が保存されている。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">HelloJni</string>
</resources>






■HelloJni.java

このファイルはJavaのソースファイル本体だ。
「System.loadLibrary("hello-jni");」によりC言語側のライブラリを取り込み、
「public native String stringFromJNI();」によりC言語側の関数をJavaで利用できるように定義、
「tv.setText( stringFromJNI() );」で実際にC言語側の関数を呼び出している。

/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.example.hellojni;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;


public class HelloJni extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        /* Create a TextView and set its content.
         * the text is retrieved by calling a native
         * function.
         */
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
    }

    /* A native method that is implemented by the
     * 'hello-jni' native library, which is packaged
     * with this application.
     */
    public native String  stringFromJNI();

    /* This is another native method declaration that is *not*
     * implemented by 'hello-jni'. This is simply to show that
     * you can declare as many native methods in your Java code
     * as you want, their implementation is searched in the
     * currently loaded native libraries only the first time
     * you call them.
     *
     * Trying to call this function will result in a
     * java.lang.UnsatisfiedLinkError exception !
     */
    public native String  unimplementedStringFromJNI();

    /* this is used to load the 'hello-jni' library on application
     * startup. The library has already been unpacked into
     * /data/data/com.example.HelloJni/lib/libhello-jni.so at
     * installation time by the package manager.
     */
    static {
        System.loadLibrary("hello-jni");
    }
}

2010年12月23日

Android NDKのサンプルプロジェクトをビルド/実行する

ndktest01.png
前回までにAndroid SDK/NDK、Eclipse、Cygwinなどをインストールし、Java/C++用のAndroid開発環境を整えた。今回はAndroid NDKに含まれるJava/CのサンプルプロジェクトをビルドしてAndroidエミュレーターで実行する。

ndktest02.png
Eclipseを起動して、「File」メニューの「New」から「Android Project」を選択して、Androidプロジェクトを新たに作る。もしもこの項目がない場合は「File」メニューの「New」から「Project」を選択し、開いたウインドウで「Android Project」を選ぶ。

ndktest03.png
プロジェクトの設定画面が開いた。ここでプロジェクト名を適当に設定し、「Create project from existing source」を選択する。そして「Browse」ボタンからAndroid NDKのサンプルプロジェクトのフォルダを指定する。

ndktest04.png
今回は「hello-jni」というAndroid NDKのサンプルプロジェクトを指定した。

ndktest05.png
次にCygwinを使って、「hello-jni」プロジェクトをビルドする。

Cygwinのコンソールで

cd /cygdrive/c/android-ndk/samples/hello-jni

ndk-build

とすればビルドできる。

ndktest06.png
再びEclipseに戻り、ビルドしたプロジェクトをAndroidエミュレーターで実行する。プロジェクトを右クリックして現れたメニューの「Run As」にある「Android Application」を選択すればいい。

ndktest07.png
これでEclipse上でパッケージが作られ、Androidエミュレーターで実行された。






ndktest08.png
今回利用したサンプルプロジェクトのソースコード見る。HelloJni.java内で表示する文字列としてstringFromJNI()という、Cで書かれた関数の戻り値を指定している。

ndktest09.png
C側のソース「hello-jni.c」では、単純に文字列を返しているだけだ。



ソースコードの修正から実行までの流れは、Cygwin上で「ndk-build」を実行してビルド、そしてEclipse上で「Run As」-「Android Application」によりパッケージのビルド/転送/実行となる。


アンドロイド開発環境の構築(その5) NDKのインストールと設定

ndk00.png
前回までにAndroid SDK&Eclipseの開発環境を利用して、JavaによるAndroidアプリ開発ができるようになった。今回はJavaに加えてC++でプログラミングできるように設定する。



まずhttp://www.cygwin.com/からCygwinをダウンロードする。

ndk01.png
ダウンロードしたCygwinのSetup.exeを実行する。

ndk02.png
Cygwinのインストーラーが起動した。

ndk03.png
インターネットからダウンロード/インストールするのでこのまま進む。

ndk04.png

ndk05.png

ndk06.png

ndk07.png
ダウンロード元は別にどこでも構わないのだが、ダウンロード速度が速いことを期待して「~.ac.jp」など日本のドメインを選ぶ。

ndk08.png

ndk09.png
警告メッセージが表示されるが気にしない。

ndk10.png
ダウンロードパッケージの選択画面が開いた。

ndk11.png
「Search」欄に「make」と入力して、「Devel」にある「make: The GNU version of the 'make' utility」の項目で「Skip」をクリックして「Skip」がバージョン表記(ここでは「3.81-2」)になるようにする。

ndk12.png
次に「Search」欄に「gcc4」と入力して、「Devel」にある「gcc4: GCC Release series 4 compiler (C & C++ install helper」の「Skip」をクリックして同じ様にバージョン表記になるようにする。このとき複数回クリックするとインストールバージョンを選べる。

ここまで設定が済んだら「次へ」ボタンを押す。

ndk13.png
自動的に依存関係が調べられ、必要となるほかのパッケージが自動選択される。

ndk14.png
そしてインターネットからダウンロード&インストールされる。

ndk15.png
これでCygwinのインストールが終わった。

ndk16.png
プログラム互換性アシスタントが開くことがあるが、気にせずに「このプログラムは正しくインストールされました」をクリックする。






ndk17.png
次にAndroid NDKをダウンロードする。ダウンロード元はhttp://developer .android. com/ sdk/ ndk/ index.html。今回ダウンロードしたのはandroid-ndk-r5-windows.zipになった。

ndk18.png
Android NDKのインストールは解凍するだけだ。ダウンロードしたファイルをダブルクリックして開く。

ndk19.png
Cドライブのルートに解凍した。

ndk20.png
フォルダ名からリリース番号を消し、「android-ndk」に変更した。






ndk21.png
次に一度Cygwinを起動する。

ndk22.png
初回起動時にはユーザー用のスクリプトファイルが自動生成される。確認したら「×」ボタンで閉じる。






ndk23.png
次にEclipseを起動する。そして「File」メニューの「Open File」を選択する。

ndk24.png
そして先ほどCygwinで自動生成させたスクリプトのうち「.bashrc」を開く。場所は「c:\cygwin\home\ユーザー名\」になる。

ndk25.png
.bashrcが開いたら、その末尾に

export ANDROID_NDK_ROOT=/cygdrive/c/android-ndk

export PATH=$PATH:$ANDROID_NDK_ROOT

の2行を追加すして保存する。

ndk26.png
次に「Help」メニューの「Install Software」を選択する。

ndk27.png
そして「Work with」のリストボックスから「Helios - http://download.eclipse.org/release/helios」を選択する。

ndk28.png
そして「Programming Language」の中から「C/C++ Development Tools」と「C/C++ Library API Documentation Hover Help」にチェックを入れて「次へ」ボタンを押す。

ndk29.png

ndk30.png
ライセンスに承諾する。

ndk31.png
これでインストールが開始される。

ndk32.png
Eclipseの再起動をする。

ndk33.png
次に「Window」メニューの「Preference」を選択する。

ndk34.png
そして「Run/Debug」の「Launching」「Default Launchers」にある「C/C++ Application」の「[Debug]」の「Standard Create Process Launcher」にチェックを入れる。

ndk35.png
次に「General」「Workspace」にある「Refresh automatically」にチェックを入れる。これを入れ忘れるとCのソースコード変更ごとに手動でRefresh作業が必要になるので忘れないようにする。



これでAndroid NDKのインストールからEclipseの設定までが終わった。次回はAndroid NDKのサンプルプロジェクトを使って実際にCによるAndroidアプリをビルド/実行する。


Androidの雛形プロジェクトを作成&実行する

test100_00.png
前回はAndroid SDK&EclipseによるAndroidの開発環境構築から、Androidエミュレーターの起動までを行った。今回はEclipseを使って新しいAndroidプロジェクト(Javaプロジェクト)を作成、エミュレーター上で実行までを行う。

test100_01.png
Eclipseを起動したら、「File」メニューの「New」から「Project」を選択する。

test100_02.png
ウイザード種類は「Android」にある「Android Project」を選択する。

test100_03.png
Androidプロジェクトの設定画面が開いた。ここでの必須項目は「Project name」「Build Target」「Package name」「Create Activity」の4項目。

「Project name」と「Create Activity」は好きな名前に設定する。「Build Target」は対象Androidのバージョン。ここではAndroid 2.3とした。

「Package name」は世界中で唯一の値になるように設定する。とは言うものの、公開せずに個人で開発する分には唯一の値というのを意識しなくてもいい。ここでは適当に設定した。

test100_04.png
これで「Finish」ボタンを押し、プロジェクトを作成する。

test100_05.png
Androidプロジェクトができた。

test100_06.png
作成したAndroidプロジェクトを実行するために、Androidエミュレーターを起動する。「Window」メニューの「Android SDK and AVD Manager」を選択する。

test100_07.png
そして起動したいエミュレーター設定を選択して「Start」ボタンを押す。

test100_08.png
今回はユーザーデータを初期化するため「Wipe user data」にチェックを入れて起動した。

test100_09.png
しばらく待つとAndroidエミュレーターが起動した。

test100_10.png
次にウインドウ左側のPackage一覧から起動したいPackageを選び、右クリックして現れたメニューの「Run As」から「Android Application」を選択する。

test100_11.png
するとAndroidプロジェクトがビルド、転送されて、Androidエミュレーター上で実行される。







test100_12.png
作成されたAndroidプロジェクトのソースファイルを見てみる。

test100.javaファイルにはメインとなるソースコードが記入されている。onCreate()内でViewに「R.layout.main」が指定されている。

test100_13.png
「R.layout.main」というのは、「res」の「layout」にある「main.xml」で、これがXMLで指定された画面構成となる。

test100_14.png
XMLのソースを見ると、表示テキストは「@string/hello」と指定されている。これもリソースからの文字列指定となる。

test100_15.png
「res」の「values」にある「strings.xml」を見ると、「hello」というリソース名に「Hello World, Test100!」という文字列が割り当てられている。



このように、on~というアクションで実行、画面デザインはXML、表示文字列はリソース指定、という構成でできている。javaのことはまったく分からないので具体的な方法は未知だが、XMLデザインにボタンを追加、javaにonClick()を追加して、Windows DialogでいうところのGetDlgItem.SetText()的な処理をすれば表示文字列の変更などができそうな雰囲気だ。


2010年12月22日

アンドロイド開発環境の構築(その4) Androidエミュレータの実行

android64.png
次にAndroidのエミュレーターを設定/実行する。「Window」メニューの「Android SDK and AVD manager」を選択する。

android65.png
「New」ボタンをクリックする。

android66.png
そして「Name」を適当に入力、「Target」でAndroidバージョンを指定し、「SD Card」でSDカード容量を設定する。そのほか液晶画面の解像度やカメラやGPSなどのハードウエア設定も必要に応じて行う。ここではそのほかの項目はデフォルトのままにした。

android67.png
起動したいエミュレーターを選択して「Start」ボタンを押す。

android68.png
初回なのでやらなくてもいいのだが、ここでは「Wipe user data」にチェックを入れた。

android69.png
すると別ウインドウが開き、Androidエミュレーターが起動する。


android70.png
しばらくするとAndroidエミュレーターが使えるようになる。


アンドロイド開発環境の構築(その3) Eclipseのインストール

android31.png
次にIDE開発環境のEclipseをダウンロードする。ダウンロード元はhttp://www.eclipse.org/ downloads/で、「Eclipse lassic 3.6.1」を選ぶ。今回は32ビット版を選択した。

android32.png
ダウンロード先をクリックしてダウンロードを開始する。

android33.png
ダウンロードしたEclipseをインストールする。zip形式のファイルを好きな場所に解凍するだけだ。

android34.png
今回はCドライブのルートに解凍した。

android35.png
そのままだと不便なので、インストーフォルダにある「Eclipse.exe」を右クリックして現れたメニューの「送る」から「デスクトップ(ショートカットを作成)」を選択して、デスクトップにショートカットを作っておく。






android36.png
次にEclipseの設定を行うために起動する。

android37.png

android38.png
Eclipseの起動時にはワークスペースの選択画面が開く。今回は「c:\workspace」とした。これは好きなフォルダを指定して構わない。

また、Eclipseの起動時に毎回ワークスペースの選択が開くのは面倒なので、今回は「Use this as the default」にチェックをして、次回からワークスペースの選択画面が開かないようにした。

android39.png
これでEclipseが起動した。

android40.png
Eclipseの「Help」メニューにある「Install New Software」を選択する。

android41.png
そして「Work with」に「http://dl.google.com/eclipse/plugin/3.6」を入力して「Add」ボタンを押す。

android42.png
レポジトリの追加画面では、そのまま「OK」ボタンを押す。

android43.png
そして「Select All」で、全部選択して次へ進む。

android44.png

android45.png
「Google App Engine Java SDK」や「Google Plugin for Eclipse」、「Google Web Toolkit SDK」が見つかった。

android46.png
ライセンス使用承諾にチェックを入れて「Finish」ボタンを押す。

android47.png
これでインストールが開始される。

android48.png

android49.png
再起動を要求されたら「OK」を押す。これはWindowsではなく、Eclipseの再起動となる。

android50.png
Eclipseに対してのネット許可を問われたら「OK」する。






android51.png
さらにEclipseの設定を続ける。「Help」メニューの「Install New Software」を選択する。今度は「Work with」に「https://dl-ssl.google.com/android/eclipse/」と入力して「Add」する。

android52.png
そして「Select All」で全て選択して次へ進む。

android53.png
今回は「Android DDMS」、「Android Development Tools」、「Android Hierachy Viewer」が見つかった。

android54.png
ライセンスの承諾をして次へ進む。

android55.png
これでインストールされる。

android56.png

android57.png

android58.png







android59.png
次にAndroid SDKのパスをEclipseに設定する。「Window」メニューの「Preference」を選択する。

android60.png
このような画面が表示されることがある。「Proceed」を押して閉じたいところだが、フォーカスが合わず閉じれないことがあるが、気にしない。

android61.png
「Browse」ボタンを押してAndroid SDKのインストールフォルダを選択する。標準では「C:\Program Files\Android\android-sdk-windows」だ。

android62.png
忘れずに「Apply」ボタンを押す。

android63.png
これでEclipseからAndroid SDKが認識された。「OK」ボタンを押して閉じる。


アンドロイド開発環境の構築(その2) Android SDKのインストール

android10.png
次にAndroidの開発キットをダウンロードする。ダウンロード元はhttp://developer.android.com /sdk/index.html
Windows用の「installer_r08-windows.exe (Recommended)」をダウンロードする。

android11.png
ダウンロードしたAndroid開発キットを実行してインストールする。

android12.png
Android SDKのインストールが開始された。

android13.png
もしもJDKがインストールされていない場合は、2つ目の画面から先へ行けない。今回は先ほどJDKをインストールしたので次へと進む。

android14.png
Android SDKのインストール先はデフォルトのままとした。

android15.png

android16.png

android17.png

android18.png
これでインストールが終りだ。このままSDK Managerの設定に入る。

android19.png
SDK Managerが開いたら、「Accept All」を選択してインストールを開始する。もしもAndroid 1.5や1.6などの古いバージョンが不要ならそれらがインストールされないように設定してもいい。

android20.png

android21.png
途中で、何か聞かれたら「Yes」を選択する

android22.png
これでSDK Managerの設定が終わった。「Close」ボタンを押す。

android23.png
ここでインストールされているSDK一覧を確認できる。「×」をクリックして閉じる。

android24.png
真っ黒の画面で気持ち悪いが気にせずに「×」を押して閉じる。






android25.png
次にAndroid SDKのパスを環境変数に登録する。

「スタート」メニューの「コンピューター」を右クリックして現れたメニューから「プロパティ」を選択する。

android26.png
そして「システムの詳細設定」を選択する。

android27.png
開いた画面で「環境変数」ボタンをクリックする。

android28.png
「システム環境変数」の中にある「Path」を選択して「編集」ボタンをクリックする。

android29.png
ここで変数値に「C:\Program Files\Android\android-sdk-windows\tools」を「;」区切りで追加する。もしもAndroid SDKをほかの場所にインストールした場合は、そのパスを指定する。

android30.png
環境変数の設定が終わったら「OK」ボタンを押して閉じる。


アンドロイド開発環境の構築(その1) JDKのインストール

しばらく前からWindows Mobile 6.5のスマートフォンを利用、Visual C++で必要なソフトを作って使っていた。Windows Mobileは基本的にWindows 7と同じソースコードで開発出来るので開発自体は楽で便利。しかし端末(Toshiba T-01A)の性能が著しく悪いのでAndoroidへ移行することにしました。



最終的にはAndroidアプリをJava&C++で作成することを目標にゼロから開発環境を整えることにしました。現段階ではAndroid実機もなし、AndroidやJavaに関する知識もなしという状態です。そのためAndroidがどんなものななのか知るために、まずはC++を利用しないJavaによる従来どおりの開発環境を構築してみます。




android00.png
まずはC++を利用しない通常のAndroid開発環境を整える。開発にはJava Development Kit(JDK)が必要なので、最初にhttp://www.oracle.com/technetwork/java/javase/downloads/index.htmlからJava Platform, Standard Editionを「Dowonload JDK」ボタンからダウンロードする。

android01.png
今回はWindows上で開発を行うので、プラットフォームは「Windows」を選択、ライセンスに同意するチェックを入れて「Continue」をクリックする。

android02.png
今回のダウンロードファイル名は「jdk-6u-windows-i586.exe」というファイル名だった。

android03.png
ダウンロード後、ダブルクリックして実行する。

android04.png
Java SE Development Kit 6のインストールが開始された。

android05.png
不要なものも多いが、気にせずに全部インストールしてしまう。

android06.png

android07.png
インストール先はデフォルトのままとした。

android08.png

android09.png
これでJDKのインストールが終わった。


2010年05月08日

Visual Studio 2010対応の日本語版WTL 8.1.9127 アプリケーションウィザード

wtl01.png
■はじめに

WTLはライセンスがCPLのオープンソースプロジェクトとして公開されている。そのためおそらく勝手に日本語化したものを配布しても問題ないと思い用意しました。ライセンス的に問題があるようでしたらお知らせください。削除します。

先月リリースされたVisual Studio 2010に対応しました。

wtl02.png
■ダウンロード

日本語版WTL 8.1.9127をダウンロード

(2010年5月8日現在最新版のWTLを元にしています)

2009年04月20日

第65回 IE用ツールバーを再びきちんと表示する (タブブラウザーを作る)

tabbrowser295.gif
前回の作業で、「タブ」をバックグラウンドを開けるようになった。しかしその副作用で、タブの開き方によって「Googleツールバー」などのIE用ツールバーが表示されなかったり、下端が欠けるなどの不具合が生じた。今回はそれらを修正する。

まずCIEToolbarInfoの中でIEツールバーを生成する処理でbVisibleを利用した条件分岐を入れる。 IDeskBandからのGetBandInfoによる情報はShowDW(TRUE)を実行しないときちんと取得できない。そのためShowDWを実行しないときはGetBandInfoによる情報を利用せずに、既存のリバー情報のみを利用するようにした。
	//hWndParentはCDummyWnd(Googleツールバーの親となるウインドウハンドル)
	//clsidIDeskBandはGoogleツールバーのCLSIDを指定する
	bool	CreateIEToolbar(IWebBrowser2* pIWebBrowser2,HWND hWndParent,IDeskBand** ppIDeskBand,const IID& clsidIDeskBand,bool bVisible)
	{
		HRESULT	hr;

		if(ppIDeskBand == NULL || pIWebBrowser2 == NULL)
			return	false;
		if(*ppIDeskBand)
		{
			ATLASSERT(0);
			(*ppIDeskBand)->Release();
			*ppIDeskBand = NULL;
		}

		hr = ::CoCreateInstance(clsidIDeskBand,NULL,CLSCTX_INPROC_SERVER,IID_IDeskBand,(void**)ppIDeskBand);
		if(FAILED(hr) || *ppIDeskBand == NULL)
			return	false;

		CComPtr<IObjectWithSite>	pIObjectWithSite;

		(*ppIDeskBand)->QueryInterface(IID_IObjectWithSite,(void**)&pIObjectWithSite);

		//デスクバンドをホスト用クラスに割り当てる
		{
			CComPtr<IIEToolbar>	pIIEToolbar;

			pIIEToolbar = new CComObject<CIEToolbar>;

			pIIEToolbar->put_hwnd(hWndParent);
			if(pIWebBrowser2)
				pIIEToolbar->put_IWebBrowser2(pIWebBrowser2);
			if(pIObjectWithSite)
				hr = pIObjectWithSite->SetSite(pIIEToolbar);

			if(SUCCEEDED(hr) && bVisible)
				hr = (*ppIDeskBand)->ShowDW(TRUE);		//表示
		}

		DESKBANDINFO	sDeskBandInfo;

		//別に必要ないが情報をたくさん取得
		::ZeroMemory(&sDeskBandInfo,sizeof(DESKBANDINFO));
		sDeskBandInfo.dwMask = DBIM_MINSIZE | DBIM_MAXSIZE | DBIM_INTEGRAL | DBIM_ACTUAL | DBIM_TITLE | DBIM_MODEFLAGS | DBIM_BKCOLOR;
		hr = (*ppIDeskBand)->GetBandInfo(0,DBIF_VIEWMODE_NORMAL,&sDeskBandInfo);

		CRect	rect;		//■変更 不要なサイズ指定が残っていたので変更

		//rebar情報の設定
		{
			HWND	hWndRebar;
			UINT	nIndex;

			hWndRebar = ::GetParent(hWndParent);
			nIndex = -1;
			::SendMessage(hWndParent,WM_DNP_GETRBINDEX,(WPARAM)&nIndex,NULL);
			if(nIndex != -1 && hWndRebar)
			{
				//ShowDW(TRUE)を実行していないとGetBandInfoでサイズが
				//取得できないので、bVisible=falseのときはリバーの大きさを
				//調整しない
				if(bVisible)		//■条件を追加
				{
					REBARBANDINFO	info;

					//MinSizeのみをリバーへ設定。本来ならもっと情報を設定すべき
					::ZeroMemory(&info,sizeof(REBARBANDINFO));
					info.cbSize	= sizeof(REBARBANDINFO);
					info.fMask	= RBBIM_CHILDSIZE;
					::SendMessage(hWndRebar,RB_GETBANDINFO,nIndex,(LPARAM)&info);
					info.cyMinChild	= sDeskBandInfo.ptMinSize.y;
					info.cyChild	= sDeskBandInfo.ptMinSize.y;
					info.cxMinChild	= sDeskBandInfo.ptMinSize.x;
					::SendMessage(hWndRebar,RB_SETBANDINFO,nIndex,(LPARAM)&info);
				}

				//位置調整
				::SendMessage(hWndRebar,RB_GETRECT,nIndex,(LPARAM)&rect);
				::SendMessage(hWndParent,WM_SIZE,SIZE_RESTORED,MAKELPARAM(rect.Width(),rect.Height()));
			}
		}

		return	true;
	}

tabbrowser296.gif また、前回の実装でCMainFrame::CreateNewTab内にバグがあったのでそれを修正する。 pView->AddIEToolbarの呼び出し時に「!」が抜けていた。
	//タブの新規作成
	//nPosはタブを追加する場所。nPos<0(もしくはnPos=m_view.GetPageCount())で一番後ろ、
	//そのほかの数値はCTabView::InsertPageにそのまま渡す
	//
	//戻ったポインタは自動削除されるため、deleteの必要なし
	//
	//bOpenInBackground=trueならバックグラウンドでタブを開く
	//
	CTabBrowser100View*	CreateNewTab(LPCTSTR pszURL,LPCTSTR pszTitle,int nPos=-1,int nImage=-1,bool bOpenInBackground=false)
	{
		bool	ret;
		CTabBrowser100View*	pView;

		//bOpenInBackgroundが指定されていても現在タブが1つもない状態ならbOpenInBackgroundをfalseに強制設定する
		if(bOpenInBackground && m_view.GetPageCount() == 0)
			bOpenInBackground = false;

		pView = new CTabBrowser100View(&m_view);	//タブビューのポインタを渡す
		if(pView == NULL)
			return	NULL;

		//ビューウインドウ生成
		if(pszURL == NULL || *pszURL == NULL)
			pView->Create(m_view, rcDefault, _T("about:blank"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL, 0);
		else
			pView->Create(m_view, rcDefault, pszURL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL, 0);
		if(pView->IsWindow() == FALSE)
		{
			delete	pView;
			return	NULL;		//ビューウインドウ生成失敗
		}

		//タブにビューを割り当てる
		if(nPos < 0)
			nPos = m_view.GetPageCount();
		if(pszTitle)
			ret = m_view.InsertPage(nPos,pView->m_hWnd,pszTitle,nImage,pView,bOpenInBackground);
		else
			ret = m_view.InsertPage(nPos,pView->m_hWnd,_T(""),nImage,pView,bOpenInBackground);

		if(ret == false)
		{
			delete	pView;
			return	NULL;		//タブへの追加失敗
		}

		//IEツールバーの生成
		{
			size_t	i;
			size_t	nSize;

			nSize = _acAvailableIEToolbar.GetCount();
			for(i = 0; i < nSize; i++)
			{
				if(_acAvailableIEToolbar[i].pwndDummy)
					pView->AddIEToolbar(*_acAvailableIEToolbar[i].pwndDummy,! bOpenInBackground);		//■変更 IEツールバー生成
			}
		}

		return	pView;
	}

tabbrowser297.gif
これでビルド/実行するとIE用ツールバーが再びきちんと表示されるようになった。



これまでの作業で

・「お気に入り」メニューを開いているときにメニューバーの「お気に入り」がハイライトにならない
・「お気に入り」メニューでフォーカスが変わるため、メニューを開きながらメニューバーを順に開けない
・「お気に入り」メニューを開くとステータスバーのデザインが壊れる
・「お気に入り」メニュー内の項目選択でステータスバーへ解説表示ができない
・「お気に入り」メニュー内の項目の有効/無効を切りかえれない
・「編集」メニュー内の「コピー」などの各項目をアドレスバーなどIEコントロール以外で利用できない
・スクリプトエラーダイアログの抑制がNavigate直後に働かない
・Navigate直後のタブ名が「about:blank」になる
・アドレスバーの表示URLが長い場合、先頭から表示されずに後方が表示される
・「戻る」「進む」ボタンにIE履歴を選択するためのドロップメニューがない
・IEツールバーを利用するのに毎回手動で表示する必要がある(終了時の状態を保存していない)
・IEツールバーを新規表示するときに必ずリバーが1行表示される
・リンクの右クリックで「新しいタブで開く」でタブを開き、「新しいウインドウで開く」では新しくウインドウを生成するようにすべき
・ページ読み込み中を示す表示がない
・アドレスバーがオートコンプリートによるURL入力に対応していない
・メニュー項目で利用できないものが多い
・実装上のバグからUNICODEビルドしかできない

などなどざっと挙げただけどもまだ不具合や未実装な必要最低限の機能が多く残っている。

しかしだんだん疲れてきたのでしばらくタブブラウザーからは離れて保留にします。お疲れ様でした。また気が向くか要望があれば再開するかもしれませんが。。。

プロジェクトファイルをダウンロード

前の10件 7  8  9  10  11  12  13  14  15  16  17