質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

1回答

3133閲覧

golangのGUI表示でウインドウの位置を設定したい

moshi

総合スコア90

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2018/12/04 03:48

編集2018/12/05 05:37

前提・実現したいこと

ウィンドウを中央に表示させたいです。

試したこと

SetBoundsで描画の開始位置を設定できるようなので以下のソースを作成しました。

import ( "github.com/lxn/walk" . "github.com/lxn/walk/declarative"   "github.com/lxn/win" ) type MyLoadWindow struct { *walk.MainWindow progressBar *walk.ProgressBar } func Main() { mw := &MyLoadWindow{} // 画面サイズ取得 sizeX := 300 sizeY := 100 // 画面情報設定 MW := MainWindow{ AssignTo: &mw.MainWindow, // Widgetを実体に割り当て Title: "コンピュータの情報を取得中", Size: Size{ sizeX, sizeY}, Font: Font{PointSize: 12}, Layout: VBox{}, Children: []Widget{ // ウィジェットを入れるスライス ProgressBar{ AssignTo: &mw.progressBar, MarqueeMode: true, }, }, } const WINDOW_HEIGHT = 100 const WINDOW_WIDTH = 200    // 画面の縦と横のサイズを取得 scrWidth := win.GetSystemMetrics(win.SM_CXSCREEN) scrHeight := win.GetSystemMetrics(win.SM_CYSCREEN)    // 描画開始位置を設定 mw.MainWindow.SetBounds(walk.Rectangle{ X: int((scrWidth - WINDOW_WIDTH) / 2), Y: int((scrHeight - WINDOW_HEIGHT) / 2), Width: WINDOW_WIDTH, Height: WINDOW_HEIGHT, }) if _, err := MW.Run(); err != nil { println("Error") return } }

発生している問題・エラーメッセージ

panic: runtime error: invalid memory address or nil pointer dereference

SetBoundsのところで上記のエラーが出てしまいます。
なぜこのエラーが出力されてしまうのでしょうか?

補足情報(FW/ツールのバージョンなど)

Golang
Windows
Walk

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

mw.MainWindowはいつnilじゃなくなるのかというと、
MW.Run()が進んだときです。
その前に参照すればnilなのでエラーになっちゃうのは当然です。

MainWindowの宣言にOnBoundChangedを追加してその中で
やろうとしていることを実行するようにしましょう。
すると、最初にシステムが決めた座標に表示される直前に以下の処理が呼ばれて
(このタイミングまでにはmw.MainWindowにインスタンスが代入済になってるはず)
表示座標を変更できます。

go

1 OnBoundsChanged: func() { 2 const WINDOW_HEIGHT = 100 3 const WINDOW_WIDTH = 200 4 5 // 画面の縦と横のサイズを取得 6 scrWidth := win.GetSystemMetrics(win.SM_CXSCREEN) 7 scrHeight := win.GetSystemMetrics(win.SM_CYSCREEN) 8 9 // 描画開始位置を設定 10 mw.MainWindow.SetBounds(walk.Rectangle{ 11 X: int((scrWidth - WINDOW_WIDTH) / 2), 12 Y: int((scrHeight - WINDOW_HEIGHT) / 2), 13 Width: WINDOW_WIDTH, 14 Height: WINDOW_HEIGHT, 15 }) 16 }, 17

投稿2018/12/05 11:55

nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問