gakさんのコードを細工して
HPEN hPen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
HGDIOBJ oldPen = SelectObject(hdc, hPen);
MoveToEx(hdc, 0, 0, 0);
LineTo(hdc, 200, 200);
int ret = DeleteObject(hPen); // ここで削除に変更
SelectObject(hdc, oldPen);
// LineTo(hdc, 200, 200);
//int ret = DeleteObject(hPen);
VERIFY(SelectObject(hdc, hPen) != NULL); //Delete済みのペンを選択する
MoveToEx(hdc, 200, 0, 0);
LineTo(hdc, 0, 200);
これでも同じでした
xpではSelect中でもDeleteObjectは有効と思います
もちろんお勧めはしません
うーん、DeleteObjectが成功を返す、結果は機能しないGDIオブジェクトです
というのはSelectObjectしていても削除できてしまうと言う意味みたいですねぇ。
でも、削除されたGDIObjectで描画をしても全く意味が無いと思います。
落っこちたって文句は言えないと思いますし。
偶々動いているのであれば、それを云々言ってもなぁと思います。
基本的なGDIのルールが変わったという話は聞いた事が無いので
実際の実装はどうあれ、Select状態にあるGDIObjectは削除すべきではないし、
削除する必要があるならSelect状態を解除しないといけないというのは
変わらないと思いますよ。
で、DeleteObjectで削除してしまったGDIObjectをSelect状態にして
描画した結果がどうなったとしてもそれは保証される範囲では無いと思うので
あまり意味が無いと思います。その部分は結局実装依存になるでしょうし。
現状動いていても実装方法に変更が加えられた場合、
動きが変わってしまう可能性は十分あります。
保証されていない部分の動作について議論しても意味が無いし、
提供されているAPIは保証された範囲で使用するべきだと思います。
純粋に興味で調べる分には良いと思いますけれど。
使うかどうかとは別問題です。